移动主机听起来很可怕,并且大多是rsync,DNS和耐心. 诀窍是两道道:一道慢道,而旧服务器仍然运行;一道快道快道,需要几秒钟.
顺序 a Buran 二号线,安装与旧服务器相同的OS版本,并做基础: SSH 密钥和防火墙. 在同一版本安装相同的服务(nginx, PostgreSQL, Docker)——但还没有开始.
从新服务器调取数据. 这个通行证可以随心所欲地延长;没有人注意到。
rsync -avz --delete \
--exclude=/proc --exclude=/sys --exclude=/dev --exclude=/tmp \
--exclude=/var/lib/postgresql \
root@OLD_SERVER_IP:/etc /etc
rsync -avz --delete root@OLD_SERVER_IP:/var/www /var/www
rsync -avz --delete root@OLD_SERVER_IP:/root /root
数据库数据目录被故意排除——一个活的PostgreSQL或MySQL dir复制的文件逐个文件被打破. 数据库作为垃圾堆移动.
在旧服务器上:
pg_dumpall -U postgres > /root/all-databases.sql
# or per database, compressed:
pg_dump -Fc -U postgres appdb > /root/appdb.dump
将垃圾堆拉入新服务器并导入:
rsync -avz root@OLD_SERVER_IP:/root/all-databases.sql /root/
sudo -u postgres psql < /root/all-databases.sql
将应用程序放入维护模式, 运行最终同步并启动服务 :
# on the old server
pg_dumpall -U postgres > /root/final.sql
# on the new server
rsync -avz --delete root@OLD_SERVER_IP:/var/www /var/www
rsync -avz root@OLD_SERVER_IP:/root/final.sql /root/
sudo -u postgres psql < /root/final.sql
systemctl enable --now nginx postgresql myapp
本地先测试——在触摸到DNS之前:
curl -H "Host: example.com" http://127.0.0.1
将A记录改为新IP,将TTL降低到一天前300秒——旧值会很快到期. 在几分钟内,大多数访客都在新服务器上;短跑者将在未来数小时内抵达。
证书: 运行 certbot --nginx 在 DNS 解决后的新服务器上。 如果您使用 Cloudflare 代理服务器, 请翻转记录并照常重新发布 。 Nginx 引导.
从几个地方检查:网站,API,邮件,克龙工作,备份. 看好旧服务器的日志一个小时——任何遗留下来的流量都意味着旧IP仍有出点.
tail -f /var/log/nginx/access.log
crontab -l
systemctl list-timers
开关后保留旧服务器一周. 然后取消它——没有戏剧性,如果错过了什么,就容易回滚.
使用双通的rsync法,停机时间只是最后同步加DNS传播——一般为2至10分钟. 旧服务器上的一个维护页面使其隐形.
任何被硬编码的旧IP都必须更改:nginx上游,app配置,防火墙允许列表. 在最后同步前用 grep 为旧IP 搜索配置 。
供给是完全自动的,面板会给你控制台并重新安装访问;迁移是一种标准的rsync工作,你可以在半小时内运行自己. 如果某事不适合,请在30分钟内支持@buran.host回答.