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

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

我目前有一个为 Linux/Apache 服务器注册的域名,我准备用新的 IP 地址替换它。

迁移数据相对较快,过程中 5 分钟的中断是可以接受的。

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

这种变化可能带来什么后果?大概是那些仍在查看旧地址的用户将继续访问旧服务器,而 DNS 缓存已过期或为空的用户将看到新域名。

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

答案1

您可以在旧 Web 服务器上使用反向代理。设置起来可能有点麻烦,但只要它是DNS 已更新,一切就绪。

接下来会发生什么:

  1. 旧 Web 服务器已配置为反向代理
  2. DNS 切换
  3. 新的 Web 服务器提供最新 DNS 记录的匹配结果
  4. 旧版网站在获得点击时,将请求转发到正确的 DNS,然后逐字输出内容。

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

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

答案2

我的公司刚刚对几个大型网站进行了此操作。我们遵循的基本程序是:

  1. 尽可能降低域的 TTL。至少提前与当前 TTL 一样多的时间执行此操作。
  2. 在新服务器上设置网站,完全按照您想要的“最终产品”进行设置
  3. 在新服务器上为站点添加别名,例如 www2.domain.com 或 www-new.domain.com。使用 Apache,您可以使用服务器别名指令。如果网站有任何动态代码(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>

这将对 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>

这次您要进行永久的 301 重定向,再次向搜索引擎爬虫提示 www.domain.com 是您希望它们索引的网站。

答案3

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

<VirtualHost *>
  UseCanonicalName Off
  ServerAdmin  [email protected]
  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>

为了确保旧服务器具有正确的地址,我在以下内容中输入了一个条目/etc/hosts

1.2.3.4 domain.com

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

a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload

答案4

当我需要这样做时,我会使用 iptables;快速执行 DNAT/SNAT,您的所有流量就会神奇地重新出现在它应该出现的地方。如果您确实需要维护源 IP 地址,反向代理可以通过设置适当的标头来提供帮助,但这需要在两端进行大量工作以确保所有内容都匹配,因此我通常不会担心像迁移这样的事情,因为它是暂时的,降低 TTL 可以处理大部分问题。

相关内容