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


8

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

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

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

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

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


我使用的rinetd比特定的虚拟主机更通用,但是如果要更换整个服务器,或者说将所有Web内容移至另一台服务器,效果很好。只需同步新服务器,设置rinetd,更改DNS。在48小时内关闭旧服务器(或其服务)。
artfulrobot

Answers:


5

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

将会发生的是:

  1. 旧的Web服务器配置为反向代理
  2. DNS切换
  3. 新的Web服务器提供来自最新DNS记录的匹配
  4. 旧网络遇到问题后,将请求转发到正确的DNS,然后逐字输出内容。

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

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


1
确保旧的网络服务器在新的DNS上更新。将记录添加到/ etc / hosts。
马修·斯克拉格

@MatthewScragg您能提供更多有关此的信息吗?步骤和结果..
Birla 2014年

1
@Birla在旧的Web服务器上,添加到。/etc/hosts 123.456.789.12 my.domain.com这只会让您的旧Web服务器知道更新的地址。当客户端访问旧的Web服务器时(因为它们没有更新DNS),Web服务器可以使用域名代理请求。我不使用Apache,但这里有一个Nginx示例:gist.github.com/scragg0x/738f144b33d17ef763d1
Matthew

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>

这会将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是您希望它们建立索引的站点。


4

好的,根据@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_proxymod_proxy_http模块,然后重新加载配置:

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

真好 但是,如何处理任意子域?
Ekevoo 2012年

4

这是一个老话题,但也许会帮助某人:

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

如果您的Web项目使用数据库(例如MySQL),则在切换DNS之前,请确保两个服务器上的应用程序(例如PHP)都连接到同一数据库。这样,读写操作就可以在同一个地方进行,而之后您不必使用其他数据库同步工具。

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

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


3

我需要这样做时使用iptables。很快的DNAT / SNAT,您的所有流量就会神奇地重新出现在应有的位置。如果您确实需要维护源IP地址,则反向代理服务器可以通过设置适当的标头来帮助您,但是这需要在两端进行大量工作以确保它们都匹配,因此我通常不必担心对于像迁移这样的临时迁移,降低TTL可以处理大部分迁移。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.