主题
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 处置。