我有一台托管 200 多个域的 Web 服务器,但需要将其移至另一个数据中心并获取新的 IP 地址。但由于所有 DNS 设置都必须手动更新,所以我考虑是否可以在旧 IP 地址上设置某种透明代理,将所有 http/https 流量转发到新 IP。这样访问者就不会发现 DNS 的移动正在被纠正。
我首先想到的是使用 nginx,但认为这会导致域上的 SSL 证书出现问题。 有没有什么好办法可以解决这个问题?
答案1
在这些情况下,我使用以下迁移过程:
- 将 DNS TTL 更改为最小值
- 等待 DNS TTL 更新
- 将密钥/证书复制到新服务器
- 将站点置于维护模式
- 将文件/数据库同步到新服务器
- 设置从旧服务器到新服务器的反向代理
- 删除新服务器上的维护模式
- 更改 DNS 条目以指向新服务器
第 6 步确保最终用户不会最终转到旧服务器,即使他们的 DNS 已解析到旧服务器 IP。
此后,继续监控旧服务器日志,查看流量何时停止。然后,您就可以拆除旧设置了。
反向代理是使用指令设置的proxy_pass
。如果最终用户 IP 地址是重要信息,则需要将其添加到旧服务器 -> 新服务器请求的 HTTP 标头中,并告诉新服务器使用标头值作为 IP 地址。
答案2
您可能首先要决定(或估计)搬家时要牺牲什么:
- 过渡的简易性(如果下面的很多要点都很重要,那么过渡将是一个项目而不是一项任务,您可能也不具备所需的专业知识)
- 停机时间(是否可以在夜间或用户活动最少时执行整个转换?)
- 访问日志的一致性(这可能非常重要,http 或 tcp 代理将掩盖远程 IP 地址)
- 向用户显示的数据的一致性(某些用户看到过时的数据是否可以接受?)
- 内容更新的可能性
- 数据安全(在很多情况下,保证数据绝对安全、不被损坏和/或泄露非常重要,即使这意味着一些停机时间)
- 可用时间(您的托管合同即将到期)
- 用户会话一致性(这正式包含在第 4 点中,但由于可能采取不同的缓解措施,值得额外考虑)
根据上述内容的组合,您可能需要使用以下一项或多项:
- TCP 代理(如 socat)
- HTTP 代理(nginx、squid 等...)
- 复杂的路由/VPN 解决方案,允许单个服务器响应 2 个 IP 地址上的请求
- 数据库复制
- 虚拟机迁移
无论选择哪种策略,您都会想要以下东西:
- 降低 DNS TTL(一切准备就绪后,您可以将其重新增加)
- 备份 - 是的,在过渡和迁移期间确实会发生不好的事情。
- 一个计划
- 如果过渡计划失败则返回的计划。
答案3
另一种选择是使用 NAT、VPN 和策略路由的组合。
您在旧位置和新位置的服务器之间设置 VPN,在旧位置的服务器上使用目标 NAT 将传入流量重定向到 VPN。在新位置的服务器上,您使用策略路由来确保对来自 VPN 的流量的回复会返回 VPN。