1.
准备与资产清单(必须)
- 列出所有资产:域名、A/AAAA记录、IP、SSH端口、后台管理口、数据库(类型+版本)、缓存(Redis/Memcached)、队列(RabbitMQ/Beanstalk)、证书路径和cron任务。
- 导出配置文件清单:/etc/nginx/sites-available 、/etc/ssl、/var/www、/etc/systemd/system 自定义unit、Docker Compose文件、.env文件(敏感信息单独安全传输)。
2.
预降低DNS TTL 与通知
- 在迁移前48小时将涉及域名的TTL降到300或更低,便于切换回滚。
- 通知团队和客户维护窗口时间,并准备维护页面(maintenance.html),在切换时短时间指向维护页以防数据不一致。
3.
完整备份:文件、数据库、配置
- 文件:使用rsync做增量备份并验证哈希,命令示例:rsync -azP --delete -e "ssh -p22" /var/www/ user@NEW_IP:/var/www/。
- 数据库:MySQL示例:mysqldump -u root -p --single-transaction --quick --lock-tables=false dbname > dbname.sql;Postgres:pg_dump -Fc -d dbname -f dbname.dump。
- 配置:scp -P22 /etc/nginx/sites-available/site.conf root@NEW_IP:/etc/nginx/sites-available/,并备份/etc/hosts、/etc/passwd必要条目。
4.
搭建新服务器基础环境
- 系统更新:apt update && apt upgrade -y 或 yum update -y。安装必要软件 nginx/mysql/docker/git等。
- 创建系统用户与SSH key:adduser deploy; mkdir ~deploy/.ssh; 将公钥写入authorized_keys。禁止密码登录并启用UFW/iptables基础规则。
5.
数据迁移实操顺序(冷迁移示例)
- 步骤:停止业务 -> 触发一次全量DB dump -> rsync文件 -> 导入DB -> 启动服务 -> 验证。
- 关键命令:ssh root@OLD "systemctl stop myapp.service && mysqldump ...";在新机:mysql dbname < dbname.sql;rsync完成后记得chown -R www-data:www-data /var/www。
6.
在线迁移与零宕机策略(蓝绿/滚动)
- 使用负载均衡器或CDN做流量切换,准备蓝绿环境。同步数据时使用主从复制或增量同步(MySQL主从、Redis复制)。
- 若使用数据库复制:在新机做从库并等待主从同步完成,切换VIP或提升为主库,缩短停机窗口。
7.
SSL证书与域名验证要点
- 如果用Let's Encrypt:certbot certonly --standalone -d example.com(停用nginx短时间)或在新机使用DNS-01验证。也可直接复制 /etc/letsencrypt 文件夹并保持权限。
- 检查证书链、OCSP、以及是否有HTTP->HTTPS重定向导致验证失败。
8.
网络、防火墙与端口细节
- 检查bind-address(例如MySQL配置bind-address=0.0.0.0)和防火墙开启3306/6379等端口时注意仅允许可信IP。
- 不要忘记IPv6:若旧服务器有AAAA记录,新服务器也需配置IPv6或更新DNS移除AAAA。
9.
应用配置、环境变量与队列
- 迁移.env或Kubernetes Secret时保密传输:scp -P22 .env root@NEW_IP:/root/ 并设置正确权限(chmod 600)。
- 迁移队列任务前暂停消费者,防止重复消费;迁移后先启动消费者的低并发模式验证再放开。
10.
切换DNS与验证流程
- 切换流程:在维护窗口内将域名A记录指向新IP(TTL低则很快生效),同时监控错误率和响应时间。
- 验证:curl -I https://example.com 查看证书和响应头,检查日志 nginx/error.log、应用日志是否有异常。
11.
回滚计划与常见坑位总结
- 回滚准备:保留旧服务器至少48小时并保持网络可达(延迟降级DNS或恢复原IP)。记录最后一次同步点(binlog位置)。
- 常见坑:忘记同步crontab(crontab -l | ssh new "crontab -"), 忘记修复文件权限(导致403)、SELinux上下文不同、环境变量遗漏、第三方API IP白名单未更新。
12.
监控、验证与自动化建议
- 上线后72小时内重点监控:请求错误率、95%响应时间、数据库慢查询、队列积压。推荐接入Prometheus+Grafana或使用云监控。
- 建议把迁移脚本化:使用Ansible或Terraform管理基础环境、用shell脚本包装rsync/db dump步骤,测试可重复执行的迁移流程以降低人为出错率。
13.
问答1:迁移时最容易导致数据丢失的操作是什么?
问:迁移过程中最常见导致数据丢失的操作有哪些? 回答:主要是未在切换点停止写入导致的增量丢失、忘记导出最新binlog位置、以及在旧机清除数据太早。解决办法是停写或使用主从复制/增量同步并记录binlog坐标,确认新库接收完毕再切流。
14.
问答2:如何保证迁移后服务无缝回滚?
问:如何设计回滚以便快速恢复到旧服务器? 回答:保持旧服运行并开放管理SSH、同步最后一次变更(rsync差异),提前把TTL设置低并保留回滚脚本(恢复DNS、切回VIP、重启旧服务),记录操作步骤与时间点。
15.
问答3:遇到证书或域名解析问题怎么办?
问:如果切换后证书失效或DNS未生效,如何应急? 回答:先用临时域名或直接通过IP+hosts文件验证应用;对证书问题可临时使用自签或复制证书文件并重载nginx;DNS未生效则把维护页指向旧服或使用CDN回退功能。
来源:案例分享海外服务器更换成功经验与遇到的坑以及教训总结