You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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
  • 同步检查系统资源:出问题瞬间用tophtop看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直接停了,这个可能性低)
三、针对资源过载的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

火山引擎 最新活动