网站更换服务器IP后需要修改哪些配置?完整检查清单

换服务器 IP 这件事,很多人以为改完 DNS 的 A 记录就结束了。实际上真正麻烦的地方不在 DNS,而在那些"悄悄记录了旧 IP 的地方":云厂商安全组里的授权规则、CDN 的回源地址、数据库账号允许登录的 host、邮件系统的 SPF 记录、第三方支付接口的回调白名单、备份脚本里写死的 rsync 目标、还有程序配置文件里硬编码的服务器地址。

这些东西不会在你改 DNS 的时候报错,它们会在切换后的某个时间点集中爆发——可能是第二天早上,也可能是三个月后第一次执行季度任务时。这篇文章给一份可以直接对照执行的检查清单,按类别整理,并给出可执行的查找命令和替换方法。

为什么换 IP 的影响面比想象中大

一个 IP 地址在生产系统里通常被引用在很多层。理解这些引用关系,是避免遗漏的前提:

网络层:安全组入站规则、白名单、负载均衡后端、专线或 VPN 的对端配置、跨机房内网互通规则。

DNS 层:除了对外服务的 A 记录,还有邮件相关的 MX 和 PTR(反向解析)、CDN 的 CNAME 目标、SPF 记录里授权的发送 IP。

应用层:反向代理的 upstream 配置、数据库连接授权、程序配置文件里的服务地址、内网服务之间的调用地址、License 或 API Key 绑定的 IP。

运维层:备份脚本的目标地址、监控系统的采集目标与告警策略、日志收集的上报地址、crontab 里的远程同步命令。

合规层:备案信息里的接入商与 IP 对应关系、部分行业的安全审查报备。

每一层的引用如果没改,症状各不相同:安全组没改表现为新机器连不上,数据库授权没改表现为应用报访问被拒绝,SPF 没改表现为邮件进垃圾箱,白名单没改表现为支付回调收不到。这些症状分散在不同的时间点出现,如果心里没有这张清单,排查会非常被动。

完整检查清单

下面这张表是核心内容,建议打印或复制到工单里逐项打勾。

类别 检查项 不改的后果 优先级
DNS 域名 A 记录 核心影响,用户访问不到 最高
DNS AAAA 记录(IPv6) 部分用户解析到不可用的旧 IPv6 地址 高
DNS CNAME 指向的目标 子域服务异常 高
DNS PTR 反向解析(多为 IP 所属方控制台设置) 外发邮件被判垃圾邮件 中
CDN 回源 IP(源站地址) CDN 节点拉不到内容,全站异常 最高
CDN CDN 侧的 IP 白名单/防盗链配置 回源被拒 高
负载均衡 云负载后端服务器组 流量仍打到旧节点 最高
负载均衡 健康检查配置 新节点被判为不健康 高
反向代理 Nginx upstream 里的 server 地址 502 Bad Gateway 最高
反向代理 其他服务器的 proxy_pass 目标 跨机业务中断 高
防火墙 新机器安全组入站放行 80/443 网站打不开 最高
防火墙 新机器系统防火墙 firewalld 或 ufw 同上,双层检查缺一不可 最高
防火墙 SSH 来源限制规则 自己也可能被锁在外面 最高
数据库 账号授权 host(如 'user'@'旧IP') 数据库连不上,报访问被拒绝 最高
数据库 主从复制或白名单中的来源 IP 复制中断 高
邮件 SPF 记录包含新 IP 外发邮件进垃圾箱 高
邮件 DKIM 是否需要重新配置 签名验证失败 中
邮件 DMARC 报告接收地址 报告丢失 低
邮件 PTR 反向解析指向域名 被大型邮件服务商拒收 中
第三方 支付/短信/接口回调白名单 收不到回调,业务中断 最高
第三方 OAuth、开放平台回调 IP 授权失败 高
第三方 Webhook 订阅目标 对方回调到旧地址 高
第三方 云厂商 API 的 IP 访问限制 调用失败 中
SSL 证书是否需要重新签发 一般为域名证书不受影响,IP 证书需重签 中
SSL 证书自动续期的验证路径 续期失败导致三个月后过期 高
应用 配置文件中的硬编码 IP 功能局部异常 高
应用 数据库里存储的站点 URL 或 IP 页面生成错误链接 中
应用 内网服务调用地址 服务间调用失败 高
应用 软件授权绑定的机器 IP License 失效 中
运维 监控系统的主机与采集目标 失去告警能力 高
运维 备份脚本中的远程地址 备份失效,长期才暴露 高
运维 crontab 里的远程同步命令 同步任务静默失败 高
运维 日志采集上报目标 日志断流,排障无据 中
合规 备案信息中的接入商与 IP 可能被接入商核查 最高(国内)

DNS 层面的修改

A 记录和 AAAA 记录是必改项,但要注意以下几个细节。

不要只改裸域名。 常见的疏漏是改了 example.com 却忘了 www、api、cdn 等子域,导致主站正常而某个子域仍然指向旧机器。改之前先把所有解析记录导出一份对照:

dig example.com AXFR 2>/dev/null || echo 'AXFR 传输通常被禁用,请登录 DNS 控制台核对'
for n in @ www api admin mail cdn img static; do printf '%-8s ' "$n"; dig "$n.example.com" A +short | tr '\n' ' '; echo; done

AAAA 记录容易被忽略。 如果之前配了 IPv6,换新服务器后旧的 AAAA 记录仍然存在,而新机器可能并没有 IPv6 地址或没有配置 IPv6 监听能力。结果是:支持 IPv6 的用户(在移动网络里占比不低)解析到 IPv6 地址但连不上,表现为"部分用户完全打不开而其他人正常"。这类问题排查起来很费时间,因为从 IPv4 网络测试一切正常。解决方案是更新 AAAA 记录,或者在新机器不支持 IPv6 时删除该记录。

dig example.com AAAA +short

PTR 反向解析不在域名 DNS 里改,而是在 IP 所属的服务商处设置(部分云厂商提供反向解析的工单或自助功能,是否可以自助要看厂商支持)。PTR 的作用是把 IP 反查成域名,邮件服务器在接收邮件时会做这个校验,没有 PTR 或 PTR 与发信域名不匹配,很容易被判为垃圾邮件。

切换 TTL 的处理同迁移流程:提前把 TTL 降到 60 或 300,至少提前一个旧 TTL 周期修改。

CDN 与负载均衡

如果站点前面套了 CDN,DNS 改的可能根本不是你的服务器 IP,而是 CDN 提供的 CNAME。这种情况下要改的不是域名的 A 记录,而是 CDN 控制台里的回源地址。

修改后做两件事:一是 CDN 控制台执行缓存刷新(否则部分节点仍在用旧内容的缓存,看起来像没切换);二是验证 CDN 节点能否正常回源到新 IP。

# 验证回源:直接访问新源站,带上 Host
curl -H 'Host: example.com' -o /dev/null -sS -w '%{http_code}\n' http://新服务器IP/

# 通过 CDN 访问并检查响应头里的节点信息
curl -I https://example.com/

如果 CDN 配置了回源 Host 或回源协议(HTTP 或 HTTPS,跟随或强制),也要一并核对。回源协议配成 HTTPS 而新服务器证书还没生效,会导致回源失败。

云负载均衡(把多台后端挂在 VIP 后面)的情况,要改的是后端服务器组里的成员 IP。改完之后重点看健康检查状态,新节点显示异常通常有几个原因:健康检查端口未放行、健康检查路径返回非 200、或者新机器上的应用还没启动完成。

防火墙与安全组:双层检查

这是最基础的,也是最常出问题的。

新服务器上要确保入站放行业务端口。 注意这是两层:云平台安全组,以及操作系统内的 firewalld(RHEL、CentOS、Rocky 系)或 ufw(Debian、Ubuntu 系)。两层都要通过才会放行,缺一层都访问不了。

Rocky、RHEL、CentOS:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Debian、Ubuntu:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

风险提示:启用防火墙或收紧 SSH 来源前,必须确认当前 SSH 端口已放行且现有连接不会断开,并确保你有云控制台的 VNC 或串口终端作为救援手段。 一旦把自己锁在外面,在没有控制台通道的情况下只能重装系统。

如果 SSH 限制了来源 IP,要记得把新服务器的出口地址和你的办公网络加进去。

验证端口是否真的对外可用,从外网测试而非本机:

# 从另一台机器测试
nc -vz 新服务器IP 80
nc -vz 新服务器IP 443
curl -o /dev/null -sS -w '%{http_code}\n' http://新服务器IP/

数据库账号授权

MySQL 或 MariaDB 的用户是"用户名加 host"二元组,'website_user'@'旧IP' 和 'website_user'@'新IP' 是两个完全不同的账号。应用服务器换成新 IP 后,如果授权里的 host 是旧 IP,连接会直接报"Access denied",而这个错误信息和密码错误完全一样,很容易误导排查方向。

在新数据库(或保持同一个数据库只换应用服务器的情况下)检查:

SELECT user, host FROM mysql.user WHERE user='website_user';
SHOW GRANTS FOR 'website_user'@'旧IP';

按需添加新授权:

CREATE USER 'website_user'@'新IP' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON website.* TO 'website_user'@'新IP';
FLUSH PRIVILEGES;

如果用网段形式授权更灵活,例如 'website_user'@'10.0.1.%',但不要用 '%' 放开所有来源,除非 database 本身也在严格的内网隔离里。

旧授权在确认切换稳定后可以删除,减少遗留权限:

DROP USER 'website_user'@'旧IP';

风险提示:DROP USER 是不可逆操作,确认无业务使用该账号后再执行。

如果涉及数据库主从复制,还要在从库执行 CHANGE MASTER TO 更新主库地址(或对应的 modern 命令 CHANGE REPLICATION SOURCE TO),并检查复制状态。

邮件相关记录

邮件是对 IP 最敏感的一块。很多站点换 IP 后网站一切正常,过一阵才发现"发给客户的报价邮件都进了垃圾箱"或者"注册验证码收不到"。

需要核对的有四项:

SPF——一条 TXT 记录,声明哪些 IP 被允许用这个域名发信。换新 IP 后必须把它加进去,否则收件方校验不通过。

example.com.  TXT  "v=spf1 ip4:新IP include:邮件服务商的记录 -all"

查询现有配置:

dig example.com TXT +short

注意 SPF 只能有一条,多个 include 或 ip4 机制要合并到同一条记录里。同时 DNS 对单条 TXT 有长度限制,机制太多需要拆分或用 include。

DKIM——存在 选择器._domainkey.example.com 的 TXT 记录里,存放公钥。它本身与 IP 无关,但如果换了域名或使用了新的邮件服务,需要重新生成密钥并发布。

dig default._domainkey.example.com TXT +short

DMARC——_dmarc.example.com 的 TXT 记录,告诉收件方如何处理验证失败的邮件。它不直接包含 IP,但如果你同时换了邮件服务商,策略可能需要调整。

dig _dmarc.example.com TXT +short

PTR——反向解析,前面提过。发送服务器 IP 反查应得到一个合理的域名,且该域名最好能正向解析回这个 IP。

验证方法很简单:实际发一封邮件到自己的 Gmail、Outlook 或企业邮箱,查看邮件原文里的认证结果。多数邮件客户端能看到 SPF、DKIM、DMARC 是否通过。

第三方服务白名单

这是最容易被遗漏的一类,因为这些信息不在你的服务器上。

需要逐个去第三方后台核对的常见项:

  • 支付渠道:支付结果的异步回调地址、API 调用的 IP 白名单、商户平台配置的可信 IP
  • 短信服务:接口调用的白名单 IP
  • 开放平台授权:OAuth 应用的回调或可信 IP
  • 地图、翻译、云 API:部分服务允许限制调用来源 IP
  • 合作伙伴对接:对方系统可能把你的 IP 加在他们的防火墙白名单里,或者你在他们的 Webhook 订阅里填了旧 IP

这些信息不全在你的掌控范围内,所以要提前而不是事后沟通。 涉及合作方防火墙变更的,可能需要对方走内部审批流程,留出足够的时间窗口。

应用配置中的硬编码 IP

程序里写死 IP 是技术债,但存量系统里很常见。用 grep 全面搜索配置文件、部署脚本和应用代码:

sudo grep -rn '旧IP' /etc/nginx /etc/php /var/www 2>/dev/null | head -n 50
sudo grep -rn '旧IP' /opt /usr/local/etc 2>/dev/null | head -n 50

不要只搜 Web 目录,还要搜 crontab 和系统级脚本:

sudo grep -rn '旧IP' /etc/cron.d /etc/crontab /var/spool/cron 2>/dev/null
sudo crontab -l -u root 2>/dev/null | grep '旧IP'

数据库里也可能存了旧 IP 或旧域名。 很多 CMS 把站点 URL 存在配置表里:

SELECT * FROM wp_options WHERE option_name IN ('siteurl','home');   -- WordPress 为例
SELECT option_value FROM 配置表 WHERE option_name LIKE '%url%';

替换时优先用命令行工具做全局替换(很多 CMS 提供 cli 命令),而不是直接 UPDATE,因为有些配置是序列化存储的,改了长度却没改长度标记会导致配置失效。

还有一个容易忽略的地方:内网服务之间的调用地址。比如应用服务器调内部 Redis、消息队列、Elasticsearch 等,如果这些服务跨机器部署且用 IP 通信,也要一并核对。推荐做法是内网用内网 DNS 或主机名而非裸 IP,这样未来变更成本更低。

运维系统:监控、备份、日志

这些系统切换失败不会立刻影响业务,但会让你在需要它们的时候发现没有数据——这是最阴险的一类遗漏。

监控:大部分监控系统按 IP 或主机名注册主机。要在新机器上部署监控代理,更新采集目标,并验证告警链路真的能工作(比如手动触发一次阈值告警看能不能收到通知)。仅仅"看到有新数据"不够,要确认告警能发出去。

备份:检查 crontab 里的备份脚本,凡是包含 rsync、scp、mysqldump 远程目标的地方都要核对。

crontab -l -u root
crontab -l -u deploy
cat /etc/cron.d/*

修改后建议手工执行一次,确认能成功(注意备份脚本手工执行可能产生全量备份,注意磁盘空间)。

日志采集:如果用了集中式日志(采集后上报到远端),要确认新机器的采集 agent 已安装且上报目标正确,否则将来排障时发现没有日志。

切换后连续几天都要主动检查这些系统的运行状态,而不是默认它们没问题。

合规:备案与接入商

如果服务器在中国大陆,备案信息里包含了接入商和对应的服务器信息。更换 IP 通常有以下两种情况:

同一接入商内部更换(比如同一云厂商换个可用区或换台机器):多数接入商支持在后台更新备案信息中的资源信息,这通常不涉及重新审核,但要去操作,不要假设换了也没事。

更换接入商:需要办理接入备案(俗称"转入"),流程与新增备案类似,需要提交材料并等待管局审核。这一项必须提前规划,因为它有明确的审核周期,不能等到切换当天才想起来。

此外,如果你的域名之前在旧接入商处做了备案,转到新的服务商而没做变更,理论上接入商有权停止这个域名的解析接入。具体政策以接入商的最新要求为准。

分批执行的时间表

把上面的清单排到时间轴上,减少遗漏:

时间 动作
T-7 天 完成全面盘点;把 DNS TTL 降到 60;通知第三方准备变更白名单
T-3 天 新服务器环境就绪,数据全量同步;启动接入商的备案信息变更流程
T-1 天 更新 CDN 回源(预置多源或准备快速切换);确认第三方白名单已加新 IP;检查 firewalld/ufw 与安全组规则
T-0 最后一次增量同步;修改 DNS A/AAAA;更新 PTR;切换 CDN 回源;更新数据库授权 host;更新反向代理 upstream
T+1 小时 多 DNS 服务器验证解析;老服务器保持反向代理吸收旧流量;观察错误日志
T+1 天 检查 crontab 执行、备份任务、监控告警、邮件发送;查 certbot 续期定时任务
T+7 天 无异常后回收旧服务器,但先做最后一次快照保留数周

常见问题

改了 DNS,但访问还是旧服务器,怎么办?

先确认 TTL 是否已过期,再用多个公共 DNS 分别查询。如果部分 DNS 返回旧值属正常,等待即可。期间用旧服务器做反向代理可以避免用户看到不一致的数据。千万不要反复改 DNS 记录,这会让缓存状态更加混乱。

IPv6 的 AAAA 记录要不要一并改?

要。如果保留旧 AAAA 而新机器不支持 IPv6,支持 IPv6 的网络(尤其是移动数据网络)上的用户会解析到不可用的地址。要么更新 AAAA,要么删除该记录。

证书需要重新签发吗?

绝大多数域名型证书与 IP 无关,不受影响,可以直接把证书文件迁移到新服务器。只有 IP 证书(直接给 IP 签发的)才需要重新申请。但要注意:自动续期的定时任务是否在新机器上配好,这是三个月后爆发的定时炸弹。

数据库连不上,报"Access denied",密码是对的?

查授权里的 host。MySQL 用户是"用户名加 host"的组合,应用服务器 IP 变了就不是一个账号了。用 SELECT user, host FROM mysql.user 核对。

第三方回调收不到怎么办?

先确认对方的白名单里加入新 IP(可能要走对方审批),再检查本机防火墙是否放行了回调来源。可以用对方后台的手动重试功能测试,同时在 Nginx 访问日志里确认请求是否到达。

旧服务器什么时候可以销毁?

建议至少保留七天,并且销毁前做一个最终快照留存数周。很多问题(比如季度性的定时任务、低频调用的回调接口)要过一段时间才暴露。

总结

  • 换 IP 的影响远超一条 A 记录,必须按 DNS、CDN、负载均衡、防火墙、数据库授权、邮件记录、第三方白名单、应用配置、运维系统、备案合规十类逐一核对。
  • 最高优先级项是域名 A/AAAA 记录、CDN 回源地址、负载均衡后端、新机器双层防火墙放行,以及数据库账号授权里的 host 二元组——这几项出错会立刻导致服务不可用。
  • 邮件相关的 SPF、DKIM、DMARC、PTR 必须在新 IP 生效后实际发信测试,仅看 DNS 记录存在不足以证明能正常投递。
  • 第三方白名单不在自己掌控范围内,需要提前至少数个工作日沟通;crontab 里的备份与同步脚本要用 grep 全量搜索旧 IP,切换后手工执行验证一次。
  • 国内服务器换 IP 要在接入商侧同步更新备案中的资源信息,跨接入商迁移需办理接入备案,必须提前预留审核周期;旧服务器保留七天以上并在销毁前留存快照。