我目前有一个为 Linux/Apache 服务器注册的域名,我准备用新的 IP 地址替换它。
迁移数据相对较快,过程中 5 分钟的中断是可以接受的。
DNS 记录的 TTL 显然为 6 到 12 小时,我无法加快速度。
这种变化可能带来什么后果?大概是那些仍在查看旧地址的用户将继续访问旧服务器,而 DNS 缓存已过期或为空的用户将看到新域名。
是否可以从旧服务器(使用 Apache 或 iptables)进行某种重定向到新 IP?旧服务器可以根据需要继续运行。
答案1
您可以在旧 Web 服务器上使用反向代理。设置起来可能有点麻烦,但只要它是DNS 已更新,一切就绪。
接下来会发生什么:
- 旧 Web 服务器已配置为反向代理
- DNS 切换
- 新的 Web 服务器提供最新 DNS 记录的匹配结果
- 旧版网站在获得点击时,将请求转发到正确的 DNS,然后逐字输出内容。
如果您正在运行 Apache,请查看 mod_proxy。如果您正在运行 IIS,请查看 ISAPI Rewrite 以获取此类功能。
(请注意,如果您想使用域名进行代理,则旧 Web 服务器上的 DNS 需要更新。否则,请直接将其代理到 IP 地址,并确保主机正在侦听没有主机名的 IP)
答案2
我的公司刚刚对几个大型网站进行了此操作。我们遵循的基本程序是:
- 尽可能降低域的 TTL。至少提前与当前 TTL 一样多的时间执行此操作。
- 在新服务器上设置网站,完全按照您想要的“最终产品”进行设置
- 在新服务器上为站点添加别名,例如 www2.domain.com 或 www-new.domain.com。使用 Apache,您可以使用服务器别名指令。如果网站有任何动态代码(PHP、mod_perl、RubyOnRails 等),请确保网站能够使用此新名称正确运行和响应。
- 在切换时,在旧服务器上设置指向新服务器的重定向
- 将 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_proxy
和mod_proxy_http
模块,然后重新加载配置:
a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload
答案4
当我需要这样做时,我会使用 iptables;快速执行 DNAT/SNAT,您的所有流量就会神奇地重新出现在它应该出现的地方。如果您确实需要维护源 IP 地址,反向代理可以通过设置适当的标头来提供帮助,但这需要在两端进行大量工作以确保所有内容都匹配,因此我通常不会担心像迁移这样的事情,因为它是暂时的,降低 TTL 可以处理大部分问题。