跳到正文

Linux 生产检查清单 ​

适用 Nginx 1.x 与主流 Linux 发行版;参数默认值以官方文档为准。 每条都可勾选,括号内是默认值或判断依据。只列「不做会出事」的动作,排查思路见 02-Linux生产排查实战.md,Nginx 机制见 01-Nginx核心原理.md。

上线前 ​

  • [ ] 改配置先 nginx -t,通过后用 kill -HUP <master_pid> 平滑重载,并保留上一版 conf 与二进制;重载失败立即回滚。用 restart 会直接掐断在途连接。
  • [ ] 三处代理超时显式配置,且满足「客户端超时 > proxy_read_timeout > 后端 P99」:proxy_connect_timeout、proxy_read_timeout、proxy_send_timeout(正文示例 5s/60s/30s,默认值以官方文档为准)。任一层缺失,慢后端都会把连接堆到 Worker 上限。
  • [ ] 限流 zone 容量按峰值独立 IP 数测算:zone=mylimit:10m 约存 160000 个 IP,按实测峰值留 2 倍余量;rate、burst 有压测依据;limit_req_status 显式设为 429(默认 503),否则限流拒绝会和上游故障混在一起;下载类接口另配 limit_conn。
  • [ ] 证书链完整,TLS 与 HSTS 分两步上线:ssl_protocols TLSv1.2 TLSv1.3,证书文件必须含中间 CA;确认全站 HTTPS 与回源都正常后,再加 Strict-Transport-Security "max-age=31536000"。HSTS 一旦下发,一年内浏览器不会回退到 HTTP。
  • [ ] 连接与磁盘容量都留出上限:worker_processes auto(等于 CPU 核数),worker_connections 按目标并发反算,进程启动后 cat /proc/<pid>/limits 确认 nofile 大于「Worker 数 × 连接数」;同时给业务日志配轮转与保留天数,journalctl --disk-usage 设上限。fd 或磁盘任一先到顶,服务都是直接不可用。

运行中 ​

  • [ ] 负载与 CPU:uptime 的 1 分钟负载连续 5 分钟高于 CPU 核数,或 top 里 %sy 明显偏高,按饱和处理;再用 top -Hp <pid> 定位到线程。
  • [ ] 内存与 OOM:free -h 的 available 低于 10% 告警;dmesg | grep -i "out of memory" 必须为 0 条,出现即说明已有进程被内核杀掉,可能表现为「无日志重启」。
  • [ ] 磁盘:df -h 单分区 >80% 预警、>90% 立即处置;日志切割用 kill -USR1 <master_pid>,切割后确认旧文件被清理而不是继续堆积。
  • [ ] IO:iostat -x 1 的 await 持续高于该盘基线(参考 >100ms)或 %util 接近 100%,用 iotop -o 找进程;IO 饱和时 Nginx 往往先表现为上游超时。
  • [ ] 网络与 Nginx 指标:ss -s 和 ss -antp | wc -l 的连接数对比「Worker 数 × worker_connections」余量;netstat -s | grep -i retrans 重传持续上升查链路;同时看 5xx 比例、429/503 限流拒绝数、lsof -p <pid> | wc -l 与 limits 的差距。

故障时 ​

  • [ ] CPU 飙高 → top 找进程 → top -Hp <pid> 找线程 → printf "%x\n" <tid> 转十六进制 → jstack <pid> | grep <hex_tid> -A 30;判断:命中 GC 线程说明是 Full GC,命中业务线程再查死循环、未预编译正则的灾难性回溯、大循环里的字符串拼接。
  • [ ] 内存持续上涨或进程消失 → free -h 与 dmesg | grep -i "out of memory" → jmap -histo:live <pid> | head -30,必要时 jmap -dump:format=b,file=heap.hprof <pid> 交 MAT 看 Dominator Tree;判断:存活对象 Top30 随请求单调增长,优先查 ThreadLocal 未清理、静态 Map 无界增长、连接池泄漏、Listener 未注销。
  • [ ] 磁盘满 → df -h 确认分区 → du -sh /* 2>/dev/null | sort -rh | head -10 逐层下钻 → lsof +L1 查已删除但被进程持有的文件;判断:lsof +L1 有输出说明空间被删掉的文件占着,用 > /path/to/logfile 截断,不要 rm 后继续等。
  • [ ] IO 高、接口变慢 → iostat -x 1 10 看哪块盘 await/%util 异常 → iotop -o 定位进程;判断:单盘指标显著高于其他盘且写进程明确,先迁日志或限速该进程;磁盘正常则转查上游与 proxy_read_timeout。
  • [ ] 大量 5xx / 端口不通 / 重载失败 → 先 nginx -t 排除配置 → journalctl -u nginx --since "10 min ago" 看错误 → ss -antp | wc -l、lsof -i :<port>、telnet <ip> <port> 确认监听与连通;判断:502 查上游进程与 backup 是否生效,504 查上游耗时是否超过 proxy_read_timeout,429/503 先看限流阈值而不是当故障处理,端口被占则按 lsof -i 的 PID 处置。

把一门技术讲透到既懂也会用