如何将 Web 服务器的 DNS 从一个 IP 地址顺利迁移到另一个 IP 地址?

Tom*_*Tom 8 domain-name-system reverse-proxy mod-proxy proxypass apache-2.2

我目前为 Linux/Apache 服务器注册了一个域名,我将用新 IP 地址上的另一个域名替换该域名。

迁移数据的速度相对较快,在此过程中出现 5 分钟的中断是可以接受的。

DNS 记录的 TTL 显然为 6-12 小时,我无法加快速度。

这种变化可能产生的后果是什么?想必还在查看旧地址的用户会继续访问旧服务器,而 dns 缓存已过期或为空的用户将看到新域。

是否可以从旧服务器(使用 Apache 或 iptables)重定向到新 IP?只要需要,旧服务器可以继续运行。

Jam*_*ger 11

我的公司刚刚在几个大型网站上做到了这一点。我们遵循的基本程序是:

  1. 尽可能降低域的 TTL。提前至少与当前 TTL 一样多的时间执行此操作。
  2. 在新服务器上完全按照您希望“最终产品”的方式设置网站
  3. 为新服务器上的站点添加别名,例如 www2.domain.com 或 www-new.domain.com。对于 Apache,您将使用ServerAlias指令。如果该站点有任何动态代码(PHP、mod_perl、RubyOnRails 等),请确保该站点将使用此新名称正确运行和响应。
  4. 在切换时,在旧服务器上设置一个指向新服务器的重定向
  5. 更改 www 的 DNS 以转到新 IP。

对于 Apache,您可能应该使用 mod_rewrite 进行重定向,以便您可以保留客户端请求的 URI。一个简单的实现是:

# old server
<VirtualHost 1.1.1.1:80>
    ServerName www.domain.com
    RewriteEngine on
    RewriteRule ^(.*)$ http://www-new.domain.com$1 [L]
</VirtualHost>

# new server
<VirtualHost 1.1.1.2:80>
    ServerName www.domain.com
    ServerAlias www-new.domain.com
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这将对 www.domain.com/anything 执行 302 临时重定向到 www-new.domain.com/anything。您希望它是临时的,因为您可能希望搜索引擎只索引 www.domain.com,而不是 www-new.domain.com。

一旦 www.domain.com 的 DNS 更改传播到您满意,您可以完全转储 www-new,或者通过另一个重定向轻轻地让任何使用它的人回到 www。和上面的过程几乎一样;设置旧服务器以处理 www-new,将 www-new 的 DNS 更改为指向旧服务器,并在旧服务器上设置重定向,将 www-new 流量发送到 www:

# old server
<VirtualHost 1.1.1.1:80>
   ServerName www-new.domain.com
   RewriteEngine on
   RewriteRule ^(.*)$ http://www.domain.com$1 [R=301,L]
</VirtualHost>

# new server
<VirtualHost 1.1.1.2:80>
    ServerName www.domain.com
    # ServerAlias removed, no longer needed
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

这次你想要做一个永久的 301 重定向,再次在搜索引擎爬虫中提示 www.domain.com 是你希望他们索引的站点。


Mar*_*son 6

您可以在旧的 Web 服务器上使用反向代理。设置可能需要一些工作,但只要ITS DNS 是最新的,您就可以了。

将会发生的事情是:

  1. 旧 Web 服务器配置为反向代理
  2. DNS切换
  3. 新的 Web 服务器提供来自最新 DNS 记录的命中
  4. 旧网站受到攻击时,会将请求转发到正确的 DNS,然后逐字输出内容。

如果您正在运行 Apache,请查看 mod_proxy。如果您正在运行 IIS,请查看 ISAPI Rewrite 以获得此类功能。

(注意,如果要使用域名进行代理,则旧Web服务器上的DNS需要是最新的。否则,直接将其代理到IP地址,并确保主机在没有主机名的情况下侦听IP)


Tom*_*Tom 5

好的,根据@Farseeker 的建议,我在旧的 Apache 服务器上设置了以下配置以将请求转发到新服务器:

<VirtualHost *>
  UseCanonicalName Off
  ServerAdmin  me@domain.com
  ServerName domain.com
  DocumentRoot /var/www/

  ProxyRequests Off

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / http://domain.com/
  ProxyPassReverse / http://domain.com/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

为了确保旧服务器有正确的地址,我在/etc/hosts

1.2.3.4 domain.com
Run Code Online (Sandbox Code Playgroud)

我还必须启用 Apachemod_proxymod_proxy_http模块,并重新加载配置:

a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload
Run Code Online (Sandbox Code Playgroud)