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

我目前有一个域名注册了Linux / Apache服务器,我将用另一个新的IP地址replace。

迁移数据将相对较快,在此过程中可能会中断5分钟。

DNSlogging显然有6-12小时的TTL,我无法加速。

这种改变可能会带来什么后果? 据推测,仍在查看旧地址的用户将继续击中旧服务器,而DNS域名服务器的用户已过期或为空则会看到新域名。

是否有可能从旧服务器(使用Apache或iptables)到新IP进行某种redirect? 旧服务器可以继续运行,只要有必要。

您可以在旧的Web服务器上使用反向代理服务器。 build立起来可能有点麻烦,但只要ITS DNS是最新的,你就可以。

将会发生什么是:

  1. 旧的Web服务器被configuration为反向代理服务器
  2. DNS切换
  3. 新的Web服务器从最新的DNSlogging中提供点击
  4. 当旧networking遇到问题时,将请求转发到正确的DNS,然后逐字输出内容。

如果您正在运行Apache,请查看mod_proxy。 如果您正在运行IIS,请查看ISAPI重写以获取此类function。

(请注意,如果要使用域名进行代理,旧Web服务器上的DNS需要是最新的,否则将其直接代理到IP地址,并确保主机正在监听IP而不使用主机名)

我的公司刚刚做了几个大的网站。 我们遵循的基本程序是:

  1. 尽可能降低域的TTL。 事先至less做好这个TTL的时间。
  2. 在新的服务器上设置网站,确切地说你想要“最终产品”
  3. 向新服务器上的站点添加一个别名,例如www2.domain.com或www-new.domain.com。 使用Apache,你可以使用ServerAlias指令。 如果网站有任何dynamic代码(PHP,mod_perl,RubyOnRails等),请确保该网站的行为和正确的响应与这个新名称。
  4. 在切换时间,在旧服务器上设置一个指向新服务器的redirect
  5. 更改DNS的www转到新的IP。

对于Apache,你应该使用mod_rewrite作为redirect,这样你就可以保留客户端请求的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> 

这将做一个302临时redirectwww.domain.com/anything到www-new.domain.com/anything。 你希望它是暂时的,因为你可能希望search引擎只索引www.domain.com,而不是www-new.domain.com。

一旦www.domain.com的DNS更改已经传播到您满意的程度,您可以彻底转储www-new,或者轻轻缓解任何人使用另一个redirect将它重新使用到www。 这几乎和上面的一样。 设置旧服务器来处理www-new,将www-new的DNS更改为指向旧服务器,并在旧服务器上设置redirect,将www-newstream量发送到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> 

这一次你想做一个永久的301redirect,再次在search引擎爬虫线索,www.domain.com是你希望他们索引的网站。

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

 <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 

我还必须启用Apache mod_proxymod_proxy_http模块,并重新加载configuration:

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

这是一个古老的线程,但也许会帮助某人:

除了Mark Henderson(mod_proxy)或James Sneeringer(302,301redirect到新子域)的答案之外,还可以在移动大型应用程序时添加关于数据库同步的其他内容。

如果您的Web项目使用数据库(例如MySQL),则在切换DNS之前,请确保来自两个服务器的应用程序(例如PHP)连接到同一个数据库。 因此,读写操作将在同一个地方进行,而且之后不必处理不同的数据库同步工具。

这可能(很可能)影响一台服务器的加载时间,但是在切换时间内,这可以被接受。

如果数据库服务器无法从外部访问,则可以在有权访问的Web服务器上设置mysql_proxy ,并且可以从外部IP访问该服务器。

当我需要这样做时,我使用iptables来做这件事。 快速DNAT / SNAT和所有的stream量神奇地重新出现在它应该是。 如果您真的需要维护源IP地址,则反向代理可以通过设置适当的标题来提供帮助,但这需要在两端都有大量的虚拟空间来确保它们全部匹配,所以我通常不会担心对于类似于迁移的事物,因为它是暂时的,并且降低TTL处理其中的大部分。