在开始迁移前确认:源机(CN2)与目标机(香港)都可SSH登录、拥有root或sudo权限、域名管理控制台能修改DNS、已评估业务停机窗、备份存储空间(远程或本地)足够。建议把迁移当做三个阶段:准备与备份、数据同步与测试、DNS切换与收尾。
列出运行的软件与版本(nginx/apache, php, mysql/postgres, redis, mail),记录配置文件路径与自定义脚本,盘点域名、SSL证书、cron任务、计划任务、外部依赖(API、第三方IP白名单)。用 du -sh /var/www 等命令估算数据量。
优先做完整快照与离线备份。文件备份示例:tar -czPf /root/backup-www-$(date +%F).tar.gz /var/www /etc/nginx /etc/php。数据库导出示例(MySQL):mysqldump -u root -p --single-transaction --routines --triggers --events --databases db1 db2 > /root/all.sql。把备份rsync或scp到安全的第三方存储。
在香港VPS上执行更新并安装必要包:apt update && apt upgrade -y;创建用户与SSH公钥,禁用密码登录,设置时区与主机名;安装相同版本的软件以避免兼容问题。如需相同PHP/MySQL版本,优先使用发行版仓库或官方源。
采用rsync增量同步,示例命令:rsync -azP --delete --exclude='cache/' --chown=www-data:www-data -e "ssh -p 22" root@源IP:/var/www/ /var/www/。第一次全量同步在低峰时段完成,切换前短暂停止写入并做一次最终增量同步以保证一致性。
数据库导入:mysql -u root -p < /root/all.sql。注意字符集与版本差异,若有严格版本不兼容,先在临时环境调整。邮箱建议使用 imapsync 迁移用户邮箱:imapsync --host1 old --user1 u --password1 p --host2 new --user2 u --password2 p。验证邮件标记与文件夹结构。
先在目标机用临时域名或hosts测试SSL。若使用Let's Encrypt,建议在切换后用 Certbot 按域名申请证书:certbot certonly --webroot -w /var/www/html -d example.com。切换DNS前将TTL调低到300秒以缩短传播时间,切换后监控解析生效。
CN2是特殊运营商路由,迁到香港后IP通常会改变,原IP无法直接搬家。若依赖IP白名单的外部服务需提前通知对方更新。注意公网带宽限制、MTU与延迟差异,必要时调整 TCP 参数(如开启BBR:modprobe tcp_bbr 并设置 sysctl)。
测试项包括:网站功能、API、数据库完整性、邮件收发、SSL链、性能基准(ab/ wrk)。保留源机至少24-72小时作为回滚点。回滚方法:把DNS指回旧IP并再次rsync/恢复数据库。提前写好回滚脚本并演练一次。
常见问题:rsync导致权限变化(解决:--chown 或修复 chown/chmod)、MySQL版本冲突(解决:导出时使用兼容选项或中间升级策略)、防火墙误拦(检查 iptables/ufw)、SSL限额(Let's Encrypt 每周/每域名限制)。实战中碰到的问题要详细记录以优化下次迁移。
迁移后优化:启用HTTP/2与gzip、使用CDN缓存静态资源、数据库开启慢查询日志并优化索引、配置缓存(redis/memcached)。若香港机房带宽低,建议使用分时段rsync与压缩传输(rsync -z)。
基础安全:关闭不必要端口、安装fail2ban、SSH使用密钥与更换默认端口、开启UFW或CSF规则。部署监控(Prometheus、Zabbix 或简单的 uptime robot)和日志收集,确保迁移后能及时发现异常。
示例时间线:准备与评估 2-4 小时、首次全量同步取决于数据量(10-24 小时)、最终切换与测试 1-3 小时、回滚窗口 24-72 小时。成本包括香港机房VPS费用、带宽超额费与人工工时,预留1-2天应急时间。
问:搬瓦工CN2迁到香港机房后,IP会不会保留?
答:一般不会保留。搬瓦工不同机房分配不同公网IP,CN2专线IP不可直接迁移到香港机房。如果业务依赖固定IP,需要提前与对方沟通或使用通用方案(如申请白名单更新、使用中间代理或VPN)。
问:如何在迁移时尽量减少停机?
答:采用先同步后切换的方式:首次全量rsync,在切换时停止写入做最后一次增量同步并迅速切换DNS或负载均衡。将DNS TTL提前降到300秒并使用 /etc/hosts 本地测试可减少感知停机。对于数据库可用主从切换或双写短时间同步。
问:迁移过程中遇到数据库导入失败该如何排查?
答:先查看错误日志(mysqld或postgres日志),常见原因有字符集不兼容、版本差异、权限不足、表空间或磁盘不足。解决步骤:确认目标DB版本与字符集(设置 --default-character-set=utf8mb4),检查磁盘空间 df -h,确保有足够的临时空间并使用 --single-transaction 导出大型InnoDB库以减少锁。