应直接监控 Nginx 进程的 CPU 和内存占用,结合 ps/top 命令、node_exporter 进程采集、stub_status 状态联动分析,并在 Docker 场景下通过 docker stats 或 cgroup 获取宿主机视角资源数据。

直接监控 Nginx 进程本身的 CPU 和内存占用,不能只依赖 Nginx 内置模块(如 stub_status),它不提供进程级资源数据。你需要结合操作系统级工具与轻量采集机制,才能准确、稳定地获取真实资源消耗。
用系统命令实时抓取进程指标
Linux 下最直接的方式是通过 ps 或 top 的批处理模式提取 Nginx 主/工作进程的资源使用:
-
ps -C nginx -o pid,ppid,%cpu,%mem,rss,vsz --no-headers:列出所有 nginx 进程(主进程 + worker),输出 PID、CPU 百分比、内存占比、物理内存(KB)、虚拟内存(KB) - 若需区分主进程与 worker,可加
--forest或按PPID过滤:主进程 PPID 为 1,worker 进程 PPID 为主进程 PID - 推荐每 10–15 秒采样一次,避免高频调用带来额外开销
集成到 Prometheus 监控体系
生产环境推荐用 node_exporter 配合进程匹配规则,无需额外脚本:
- 确保 node_exporter 启动时启用
--collector.processes - 在 Prometheus 配置中添加进程匹配规则,例如:
- job_name: 'nginx-process'
metrics_path: /probe
params:
module: [process]
static_configs:
- targets: ['nginx']
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9100 - 查询语句示例:
process_cpu_seconds_total{job="nginx-process", process_name=~"nginx.*"}process_resident_memory_bytes{job="nginx-process", process_name=~"nginx.*"}
配合 Nginx 自身状态做关联分析
CPU/内存升高未必是 Nginx 本身问题,需和请求负载联动判断:
- 启用
stub_status模块,暴露/nginx_status接口获取活跃连接数、接受/处理请求数等 - 用脚本(如 Bash 或 Python)定时拉取该接口,并同步执行
ps命令,把请求速率(如 req/sec)与 CPU% 做时间对齐 - 若 QPS 上升但 CPU 不明显增长 → 可能 I/O 等待或缓存命中率高;若 CPU 飙升但 QPS 平稳 → 留意是否开启高开销功能(如高阶 gzip、复杂 rewrite)
注意 Docker 容器场景的特殊性
若 Nginx 运行在 Docker 中(如 Nginx Proxy Manager),进程指标需从宿主机视角采集:
- 容器内看到的 PID 是隔离后的,
ps结果不可直接用于宿主机监控 - 应使用
docker stats nginx-proxy-manager --no-stream获取实时 CPU%、内存使用量(MB/GB)、内存限制值 - 更规范的做法:在
docker run或docker-compose.yml中设置resources.limits,再通过 cgroup 文件(如/sys/fs/cgroup/memory/docker/xxx/memory.usage_in_bytes)读取精确值


















