worker_rlimit_core 必须置于 nginx.conf 全局块、events 块之前,且需同步配置系统 ulimit、systemd limitcore 和 working_directory 路径权限,否则无法生成 core 文件。

要让 Nginx 在 worker 进程崩溃时自动留下可调试的 core 文件,worker_rlimit_core 本身只是其中一环,必须和系统限制、路径权限、启动环境协同生效。单独设个值,几乎肯定失败。
必须写在全局块,且位置严格固定
该指令只能出现在 nginx.conf 最顶层(main context),user、pid、events 等指令同级的位置,且必须在 events 块之前。放错地方会直接导致 nginx 启动报错:
- ❌ 错误:塞进 http 或 server 块 → 报 “directive is not allowed here”
- ✅ 正确:紧贴在 pid 或 user 下方、events 上方
典型写法:
user nginx;
pid /var/run/nginx.pid;
worker_rlimit_core 2G;
working_directory /var/tmp/nginx/coredumps;
events {
worker_connections 1024;
}
系统级限制必须同步打开
Nginx 的设置只是进程软限制,最终能否写 core,取决于三件事是否都满足:
- shell 启动前执行
ulimit -c unlimited(或设为具体值),否则 master 进程继承的限制为 0 -
/proc/sys/kernel/core_pattern不能是管道形式(如|/usr/lib/systemd/systemd-coredump),否则 core 被 systemd 拦走,Nginx 的working_directory完全失效 - 若用 systemd 管理(绝大多数生产环境),需在 service 文件中显式放开:
LimitCORE=infinity或LimitCORE=2G,然后systemctl daemon-reload && systemctl restart nginx
working_directory 是落地关键,不是可选项
不设这个,core 默认写入 master 启动时的工作目录(通常是 /,权限不足或不可写);设了但路径不对,照样丢数据:
- 目录必须是本地磁盘(禁用 NFS、tmpfs)
- 剩余空间建议 ≥5× 所设 core 上限(例如设 2G,预留至少 10G)
- 对 nginx worker 用户(如 nginx 或 www-data)有 rwx 权限:
chown nginx:nginx /var/tmp/nginx/coredumpschmod 755 /var/tmp/nginx/coredumps
验证是否真正起作用
重启 nginx 后,挑一个 worker 进程 PID(如 12345),查它的实际限制:
cat /proc/12345/limits | grep "Max core file size"
输出应为类似:
Max core file size 2147483648 2147483648 bytes
若显示 0,说明配置未生效,或被 ulimit/systemd 覆盖。











