NGINX随机停止工作需手动重启,请求排查与优化方案
我之前处理过好几起类似的NGINX周期性挂掉的情况,给你梳理几个实用的排查和优化方向:
一、先从NGINX本身的运行痕迹找线索
你说站点日志没有效信息,大概率是没找对日志或者日志级别不够:
- 先查系统服务日志:执行
journalctl -u nginx,这里会记录NGINX启动、停止、崩溃的系统层面信息,比如是不是被系统OOM Killer(内存不足杀手)干掉了,或者进程崩溃的核心转储提示 - 临时开启debug级日志:在
/etc/nginx/nginx.conf里把error_log的级别改成debug(比如error_log /var/log/nginx/error.log debug;),然后重启NGINX。等下次出问题后,这个日志会记录每个请求的详细处理流程,能帮你定位是哪个请求触发了崩溃 - 检查进程状态:出问题时立刻执行
ps aux | grep nginx,看看主进程和worker进程是彻底消失了,还是worker进程僵死(比如状态是Z) - 同步检查系统资源:出问题瞬间用
top或htop看CPU、内存、磁盘IO情况——比如Node进程内存泄漏占满内存,会导致NGINX无法fork新的worker进程,直接挂掉
二、设置针对性监控,提前捕捉异常
除了基础的站点下线告警,这些监控能帮你提前发现隐患:
- NGINX进程存活监控:用
monit或者写个简单的shell脚本,每隔1分钟检查NGINX主进程是否存在,不存在就发邮件/短信告警(别先急着自动重启,先抓原因) - 系统资源阈值监控:
- 内存:监控可用内存,当低于512MB(t2.medium总内存4G,留512M给系统)时告警
- CPU:监控NGINX、Node、PHP-FPM进程的CPU使用率,持续超过80%就要警惕
- 磁盘:监控
/var/log和根目录的磁盘使用率,避免日志占满磁盘导致NGINX无法写入日志而崩溃
- NGINX连接数监控:先确认NGINX有没有编译
http_stub_status_module(执行nginx -V看输出),如果有,在配置里加个状态端点:
然后用脚本定时抓取server { listen 127.0.0.1:8080; location /nginx_status { stub_status on; allow 127.0.0.1; deny all; } }curl http://127.0.0.1:8080/nginx_status,监控活跃连接数和等待连接数,如果等待数持续飙升,说明连接池不够用了 - Node与PHP-FPM状态监控:
- Node:用
pm2 monit实时看8个Node进程的内存和CPU,有没有内存泄漏的迹象——毕竟Node站点依赖WP REST API,如果API请求阻塞,可能导致Node占满连接,反过来拖垮NGINX - PHP-FPM:虽然你说重启PHP没用,但还是要监控PHP-FPM的进程数和请求队列,避免PHP-FPM挂了导致NGINX返回502(不过你的情况是NGINX直接停了,这个可能性低)
- Node:用
三、针对资源过载的NGINX配置优化
如果排查后确认是资源过载,可以调整这些参数:
- worker进程数:设置成和CPU核心数一致,t2.medium是2核,所以在
nginx.conf里写worker_processes 2; - 连接数上限:调整
events块里的worker_connections 4096;(默认1024),再加multi_accept on;让worker进程尽快接受新连接 - 超时时间优化:避免连接长时间占用资源,在
http块或虚拟主机配置里加:proxy_connect_timeout 10s; proxy_send_timeout 10s; proxy_read_timeout 10s; client_header_timeout 10s; client_body_timeout 10s; send_timeout 10s; - 静态资源缓存:把WordPress的图片、CSS、JS等静态文件用NGINX缓存,减少PHP-FPM和NGINX的压力:
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ { expires 30d; add_header Cache-Control "public, no-transform"; } - 请求速率限制:防止爬虫或恶意请求占满连接,在
http块定义限制规则,然后在虚拟主机里引用:limit_req_zone $binary_remote_addr zone=wp_limit:10m rate=10r/s; location / { limit_req zone=wp_limit burst=20; }
最后提醒一下:你的NGINX版本是1.10.3,属于比较老的版本了,可能存在一些已修复的崩溃bug,排查完如果找不到原因,可以尝试升级到稳定版(比如1.18.x或更高的长期支持版本)。
内容的提问来源于stack exchange,提问作者Kirill Miniaev




