这不是一份「最佳实践大全」,是一张上线前真的会照着过一遍的清单。每一条都对应一次真实的翻车。
1. 时间与时区
timedatectl 看一眼。时区错不影响写代码,但会让日志、备份文件名、定时任务全部对不上。
2. 磁盘余量
df -h 和 du -sh /var/log。日志打满盘是最常见的「服务莫名其妙挂了」。
3. swap 与内存
小内存机器上,systemd-oomd 会在内存吃紧时直接杀进程。看 dmesg | grep -i oom 比看应用日志更快。
4. 防火墙 三层要分清楚:云安全组、系统防火墙(ufw/firewalld)、应用监听地址。只监听 127.0.0.1 的服务,不需要在防火墙上开端口——这一点经常被搞反。
5. 进程守护
systemctl is-enabled 要看到 enabled,不只是 active。重启之后活不下来的服务,等于没部署。
6. 日志轮转
journald 默认有上限,但自己写到文件里的日志没有。检查 /etc/logrotate.d/ 或应用内的滚动策略。
7. 健康检查 一个真正的健康检查至少能证明「进程在、数据库连得上」,而不是只看端口有没有监听。
curl -s http://127.0.0.1:3000/api/health # {"ok":true,"db":"ok"}
8. 优雅退出
收到 SIGTERM 时先停止接收新请求、再合并 WAL、最后关库。没有这一步,重启就可能留下一个需要人工修的数据库。
9. 备份可用性
「有备份」和「备份能恢复」是两件事。每周至少做一次 --dry-run 校验,每月真恢复一次到临时目录。
10. 恢复顺序 先停服务再换库。热恢复在 WAL 模式下会丢数据,这不是理论风险,是实测会复现的。
11. 异地副本 同盘备份只能防「手滑」,防不了「盘坏」。至少同步一份到另一台机器或对象存储。
12. 凭据收敛
# 看一眼谁在登录
last -a | head
清单的价值不在于「全」,而在于每次上线都过一遍。真正会出事的,往往是那些「上次没问题的」条目。