要让nginx稳定生成可用core文件,必须闭环配置worker_rlimit_core(全局块、events前)、系统ulimit/systemd limitcore、working_directory路径权限及/proc/pid/limits验证,缺一不可。

要让 Nginx 在生产环境稳定生成可用的 core 文件用于崩溃分析,worker_rlimit_core 不能单独启用,必须和系统限制、路径权限、验证步骤形成闭环。配置错位或遗漏任一环节,都会导致 core 文件不生成、生成后为空、或无法用 GDB 定位真实崩溃点。
位置与写法:只能放全局块,且必须在 events 前
该指令只在 nginx.conf 最外层(main context)生效。放在 http、server 或 location 块里会直接启动失败,报错:“worker_rlimit_core” directive is not allowed here。
- 正确位置示例(nginx.conf 顶部):
worker_rlimit_core 2G;
working_directory /var/tmp/nginx/coredumps;
events {
worker_connections 1024;
}
- working_directory 不是可选,而是关键保障——它指定 core 文件实际写入路径,避免被 systemd 拦截或落到 tmpfs/NFS 上
- 值设为 2G、100M 或 unlimited 均可;unlimited 表示交由系统 ulimit 控制,但需确保系统级设置已同步放开
系统级限制必须同步打开
Nginx 的 worker_rlimit_core 只是进程级软限制,最终能否落地,取决于操作系统是否允许生成 core。
- 检查当前 shell 限制:
ulimit -c,若为 0 则禁止生成;临时启用:ulimit -c unlimited - 永久生效:在
/etc/security/limits.conf中添加
nginx soft core unlimited
nginx hard core unlimited - 若用 systemd 管理(主流方式),还需在
/etc/systemd/system/nginx.service.d/override.conf中加入:
[Service]
LimitCORE=infinity
然后执行systemctl daemon-reload && systemctl restart nginx - 检查内核 core_pattern:
cat /proc/sys/kernel/core_pattern。若输出以|/usr/lib/systemd/systemd-coredump开头,说明 core 被 systemd 拦截,Nginx 的 working_directory 将失效。此时需改回默认路径模式,例如:echo "/var/tmp/nginx/coredumps/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern
路径与权限:确保 core 真正落盘
working_directory 指定的目录必须满足三个硬性条件,否则 core 写入失败且无日志提示。
- 路径必须位于本地物理磁盘(禁用 NFS、tmpfs、/dev/shm),推荐
/var/tmp/nginx/coredumps这类独立挂载点 - 剩余空间 ≥ 5× worker_rlimit_core 设置值(如设了 2G,建议预留至少 10G)
- 目录对 Nginx worker 用户(如 nginx 或 www-data)有读、写、执行权限:
sudo mkdir -p /var/tmp/nginx/coredumpssudo chown nginx:nginx /var/tmp/nginx/coredumpssudo chmod 755 /var/tmp/nginx/coredumps
验证是否真正生效
重启 Nginx 后,不能只看配置文件是否写对,必须查进程实际限制。
- 获取一个 worker 进程 PID:
pgrep -f "nginx: worker" - 检查其 core 限制:
cat /proc/PID/limits | grep "Max core file size" - 正常输出应类似:
Max core file size 2147483648 2147483648 bytes(即 2G) - 若显示 0,则说明系统 ulimit、systemd LimitCORE 或 core_pattern 中某处仍为禁用状态










