我正在更换我的网站 example.org 的服务器。旧服务器的 IP 不能用于新服务器。我想在零停机时间内用新服务器替换旧服务器。
example.org 上运行着许多不同的服务,它不仅仅是一个 Web 服务器应用程序,它还是一个邮件服务器、git 服务器、mumble 服务器等等。
我的想法是:
- 同步服务器的数据,以便新服务器拥有与旧服务器完全相同的数据
- 更新域名,使 example.org 指向新 IP
- 在旧服务器上,设置 iptables 规则以将所有 http、https、smtp 等流量重定向到新服务器。不过,我不确定要使用哪些 IP 规则,因此需要一些帮助。
现在,这听起来不错,但我觉得 SSL 会出现问题。
例如,如果用户 Alice 在浏览器中导航到 example.org,由于 DNS 更改尚未对她生效,因此解析为旧 IP,然后旧 IP 将她重定向到新 IP,我认为她的浏览器会崩溃。它会看到使用 SSL 证书的 example.org 的新 IP,而 example.org 显然解析为不同的 IP,即旧 IP,因为 DNS 缓存尚未为 Alice 更新。因此,Alice 的浏览器中会显示一个巨大的红色 SSL 警告,指出新 IP 不是 example.org。
邮件服务器(SSL smtp)和在 example.org 上运行的其他服务也会发生类似问题。我该如何解决这个问题?
理想的解决方案是以某种方式使用 iptables,这样旧服务器就可以代理新服务器,而不是将用户重定向到新服务器。这样,DNS 缓存尚未更新的用户将像这样通信:[用户] <---> [旧服务器] <---> [新服务器]。他们甚至不知道新服务器的存在,对他们来说,这看起来就像他们与旧服务器的正常通信。我对这种代理解决方案的唯一问题是,新服务器将看到旧服务器的源 IP,而不是用户的源 IP。这可能会破坏很多东西,例如,Fail2Ban 可能会因为某些用户多次输入错误的邮件密码而对旧服务器的 IP 进行防火墙 10 分钟,从本质上拒绝所有未更新 DNS 并使用代理的其他用户访问邮件服务器。
答案1
最简单的方法不需要通过旧服务器进行代理:
- 降低
TTL
到类似于300
秒的程度。 - 等待至少旧的
TTL
缓存过期。 - 在流量较少时更改 IP。
- 修改
TTL
回原来的值。
您的最大停机时间现在非常短。
对于您的顾虑:
- SSL/TLS 不关心 IP 地址,只关心主机名。甚至可以使用同一个证书为同一个站点提供多 IP 集群。任何浏览器都没有问题。
- Fail2ban 有白名单:用于
ignoreip =
为您的旧服务器创建例外。 - 对于这种情况,您不需要实时复制 SQL。提前移动数据库,并使旧服务器上的站点使用新服务器上的 SQL。
- 不要代理 SMTP。即使在 DNS 更改之前,您也可以使用 MTA 将所有邮件通过旧服务器转发到新服务器。只需将旧服务器配置为辅助 MX,然后让新服务器信任它即可。
答案2
您可以研究 ssh 隧道以将您的服务请求发送到新服务器。我见过这种情况,主机名解析为旧服务器,然后通过 ssh 将流量转发到新服务器。如果在新服务器上忽略旧服务器 IP,则 fail2ban 应该不会有问题。