我目前在Linux / Apache服务器上注册了一个域名,该域名将用新IP地址上的另一个域名替换。
迁移数据将相对较快,在此过程中中断5分钟是可以接受的。
DNS记录的TTL显然为6到12个小时,我无法加快速度。
这种变化可能带来什么后果?假定仍在查看旧地址的用户将继续访问旧服务器,而dns缓存已过期或为空的用户将看到新域。
是否可以从旧服务器(使用Apache或iptables)到新IP进行某种重定向?旧服务器可以根据需要继续运行。
我目前在Linux / Apache服务器上注册了一个域名,该域名将用新IP地址上的另一个域名替换。
迁移数据将相对较快,在此过程中中断5分钟是可以接受的。
DNS记录的TTL显然为6到12个小时,我无法加快速度。
这种变化可能带来什么后果?假定仍在查看旧地址的用户将继续访问旧服务器,而dns缓存已过期或为空的用户将看到新域。
是否可以从旧服务器(使用Apache或iptables)到新IP进行某种重定向?旧服务器可以根据需要继续运行。
Answers:
您可以在旧的Web服务器上使用反向代理。设置可能需要一些工作,但是只要ITS DNS是最新的,您就可以了。
将会发生的是:
如果您正在运行Apache,请查看mod_proxy。如果您运行的是IIS,请查看ISAPI Rewrite以获取此类功能。
(请注意,如果要使用域名进行代理,则旧Web服务器上的DNS必须是最新的。否则,请将其直接代理到IP地址,并确保主机正在侦听没有主机名的IP)
/etc/hosts
123.456.789.12 my.domain.com
这只会让您的旧Web服务器知道更新的地址。当客户端访问旧的Web服务器时(因为它们没有更新DNS),Web服务器可以使用域名代理请求。我不使用Apache,但这里有一个Nginx示例:gist.github.com/scragg0x/738f144b33d17ef763d1
我公司只是通过几个大型网站来做到这一点。我们遵循的基本过程是:
对于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,将DNS-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是您希望它们建立索引的站点。
好的,根据@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>
为了确保旧服务器的地址正确,我在中输入了一个条目/etc/hosts
:
1.2.3.4 domain.com
我还必须启用Apache mod_proxy
和mod_proxy_http
模块,然后重新加载配置:
a2enmod proxy
a2enmod proxy_http
/etc/init.d/apache force-reload
这是一个老话题,但也许会帮助某人:
除了Mark Henderson(mod_proxy)或James Sneeringer(302,301重定向到新的子域)的答案之外,还可以在移动大型应用程序时添加有关数据库同步的其他内容。
如果您的Web项目使用数据库(例如MySQL),则在切换DNS之前,请确保两个服务器上的应用程序(例如PHP)都连接到同一数据库。这样,读写操作就可以在同一个地方进行,而之后您不必使用其他数据库同步工具。
这(很可能)会影响一台服务器上的加载时间,但是在切换期间,这是可以接受的。
如果无法从外部访问数据库服务器,则还可以在Web服务器上设置mysql_proxy,该服务器可以访问它,并且可以从外部IP访问。