1.1 概述:本文针对台湾地区站群(多个域名/子站托管在VPS上)迁移到新VPS或跨机房迁移,给出可执行的逐步操作流程,重点在于通过合理的DNS TTL调整和双向同步实现流量无缝转移。
1.2 目标:最小化停机、保证数据一致、保留SSL与会话、提供可回滚方案,并在切换完成后验证并监控。
2.1 列清单:列出所有域名/子域、绑定IP、虚拟主机配置(nginx/apache)、SSL证书路径、站点代码位置(/var/www/xxx)、数据库(MySQL/MariaDB/Postgres)实例、计划外联服务(Redis、Elasticsearch)、定时任务/crontab、第三方回调IP白名单。
2.2 权限与账号:确保有新旧VPS的root或sudo账号、SSH密钥、DNS管理控制台账号、SSL私钥备份、DB管理员账号。准备好VPN或跳板机以便安全操作。
3.1 系统与安全:在新VPS上安装相同或兼容的操作系统版本,更新补丁(sudo apt update && sudo apt upgrade),创建运维账号,禁用root密码登录,配置SSH密钥并修改默认端口(/etc/ssh/sshd_config)。
3.2 软件堆栈:安装web服务器(nginx/apache)、PHP/Node/其他运行时、数据库服务(或准备连接外部DB)、redis、必要的模块与依赖。确保版本兼容并记录配置差异。
3.3 防火墙与网络:开放必要端口(80/443/22/3306等),配置ufw或iptables,仅允许管理IP访问管理端口,启用基本DDoS防护与fail2ban。
4.1 使用rsync做全量同步的通用命令示例:rsync -avz --delete --exclude='cache/' -e "ssh -p 22" /var/www/site/ user@newvps:/var/www/site/。--delete 小心使用,先在目标进行干净目录测试。
4.2 建议:先把大文件(图片/视频)分批同步,检查权限与SELinux上下文(若启用),同步后在新服务器上运行php-fpm/nginx检查代码是否能正常加载。
5.1 初始导出:在访问量允许的窗口执行mysqldump --single-transaction --quick --lock-tables=false -u root -p dbname > /tmp/dbname.sql,用以获取一致性快照(InnoDB表)。
5.2 导入到新库:scp /tmp/dbname.sql user@newvps:/tmp/ 后在新VPS执行mysql -u root -p dbname < /tmp/dbname.sql。若数据量大建议使用物理复制或 Percona XtraBackup。
5.3 增量同步策略:使用二进制日志(binlog)或设置replication从旧库实时同步到新库,或在切换前使用pt-table-sync/rsync binlog增量同步,确保切换瞬间数据丢失最小。
6.1 会话位置:检查应用是否使用本地文件会话(需迁移会话文件)或使用Redis/DB中心化会话。若是本地会话,建议切换到Redis并在迁移前同步数据或延长迁移窗口。
6.2 Cookie域与负载均衡:确认cookie的domain/path设置,若域名不变通常无影响;若切换到新的子域或IP,注意设置SameSite及Secure属性,避免登录态丢失。
7.1 迁移证书:如果使用自签或商用证书,直接复制证书与私钥到新VPS(保护私钥权限chmod 600),配置nginx ssl_certificate与ssl_certificate_key。
7.2 使用Let's Encrypt:在新VPS上用certbot验证域名并申请证书。为了避免频繁请求CA,建议先复制现有证书并在切换后再renew;或者在测试期间使用临时hosts绑定验证。
8.1 /etc/hosts 测试:在运维机器或本地浏览器机器上修改hosts文件,把域名指向新VPS IP,验证页面加载、登录、支付与第三方回调等功能是否正常。
8.2 自动化与人工测试:运行curl -I https://example.com 检查响应头;使用站点健康检查脚本、Selenium或浏览器手工验证关键业务链路(下单、登录、搜索)。
9.1 预先降低 TTL:在切换前48小时将相关A/AAAA/CNAME记录TTL降到300秒(5分钟)或更低(60-120秒亦可),以便切换时加快解析更新。注意部分DNS提供商对最小TTL有限制。
9.2 切换窗口选择:选择低峰时段切换,并确保有回滚窗口。切换过程包括:再次增量同步数据 -> 更新DNS指向新IP -> 持续监控并等待TTL过期生效。
10.1 更新记录:在DNS管理控制台将A记录从旧IP改为新VPS IP;如果使用CNAME需指向新的负载域名。对多台主机的站群,建议脚本化批量更新API(Cloudflare/Route53等提供API)。
10.2 验证生效:使用dig +short @8.8.8.8 example.com 或 dig +trace 检查不同DNS解析,curl --resolve example.com:443:new_ip https://example.com/ 可直接向新IP发起请求以检验应用响应。观察访问日志确认请求流向。
11.1 监控要点:实时监控访问日志、错误日志、数据库连接数、响应时间及第三方接口失败率。打开详细日志级别观察首小时异常。
11.2 回滚策略:若发现严重问题,立即把DNS记录改回旧IP(由于TTL低,通常5分钟内回退)。同时暂停向新服务器写入(如写流量少则可切换回写主库),并保留新VPS数据用于事后分析。
11.3 清理与收尾:确认一周无异常后清理旧VPS(备份再销毁),更新监控/运维文档,恢复DNS TTL到正常值(如3600或86400)。
12.1 问:如何在DNS切换时保证正在进行的交易不会丢失?
12.2 答:使用数据库主从复制或双写方案确保新旧库数据一致;会话使用Redis或数据库共享而非本地文件;在最终切换前做一次短时只读窗口或使用应用层的写入队列(先写入消息队列再消费)来避免丢单。降低TTL并在切换瞬间保持旧服务一段缓冲时间也是常见做法。
13.1 问:TTL设为低会带来什么风险与成本?
13.2 答:低TTL会导致DNS解析请求频繁到权威DNS,增加每秒查询量,可能带来流量成本(云DNS按查询计费)与延迟抖动。同时某些ISP或递归DNS会忽略极低TTL导致生效不稳定。建议仅在切换前短期降低TTL,切换完成后恢复。
14.1 问:切换过程中如何验证流量已经切换到新VPS?
14.2 答:通过以下方法验证:1) 观察新VPS的访问日志(tail -f /var/log/nginx/access.log)是否出现真实请求;2) 使用dig/nslookup在不同公网DNS上查询A记录是否返回新IP;3) 客户端curl、浏览器访问并比对响应头(如自定义X-Server-Id);4) 使用CDN/监控平台和真实用户监控(RUM)查看地域解析是否切换。