必须同时配置 worker_rlimit_core、systemd LimitCORE、ulimit -c unlimited、core_pattern 路径及 working_directory 权限,且 Nginx 需启用 --with-debug 编译选项,否则无法生成可用 core 文件用于 gdb 调试。

要让 Nginx worker 进程崩溃时生成可用的 core dump 文件,仅靠 worker_rlimit_core 一项配置远远不够。它只是告诉 Nginx 自身去设置进程的 core 文件大小限制,但真正生效依赖操作系统级配合、启动环境约束和调试支持编译选项。
确保 Nginx 编译时启用了调试符号
若未启用 --with-debug,即使拿到 core 文件,gdb 也无法还原完整函数名与行号,堆栈信息将严重缺失。
- 检查当前 Nginx 是否带 debug:运行
nginx -V 2>&1 | grep -o with-debug,有输出才表示支持 - 如无,需重新编译:在
./configure中加入--with-debug,再make && make install - 生产环境可保留 debug 版本二进制,仅在需要排查时临时切换(不建议长期开启 debug 日志)
正确配置 worker_rlimit_core 及其前提条件
worker_rlimit_core 是 Nginx 主配置块指令,但它只在 worker 进程 启动时 调用 setrlimit(RLIMIT_CORE)。若系统已禁止非 root 进程生成 core,该设置会被内核忽略。
- 在
nginx.conf的顶层(events上方)添加:
worker_rlimit_core 2G;(单位支持k/m/g,设为0表示不限,但实际仍受系统限制) - 必须确保 Nginx 启动用户(如
www-data或nginx)有权限写入 core 目录;推荐显式指定路径:
working_directory /var/tmp/nginx-core;(并确保该目录存在、属主正确、有写权限) - 注意:该指令对 master 进程无效,只作用于 fork 出的 worker 进程
系统级 core dump 全链路打通
Linux 内核是否允许生成 core、保存到哪、命名规则、大小上限,均由内核参数与 shell 限制共同控制。
- 临时生效(测试用):
ulimit -c unlimited(需在启动 nginx 前执行,例如在 systemd service 的 ExecStart 前加ExecStartPre=/bin/sh -c "ulimit -c unlimited") - 永久生效(推荐):
在/etc/systemd/system/nginx.service.d/override.conf中添加:
[Service]
LimitCORE=infinity - 设置 core 文件路径与格式(避免被丢弃):
编辑/etc/sysctl.conf,加入:
kernel.core_pattern = /var/tmp/nginx-core/core.%e.%p.%t
然后执行sysctl -p - 确认 SELinux/AppArmor 未拦截(CentOS/RHEL 默认可能阻止):
ausearch -m avc -ts recent | grep core,必要时临时设为 permissive 模式验证
验证与触发测试
配置完成后不能只等自然崩溃——应主动触发一次可控 segfault 来验证流程是否闭环。
- 向某个 worker 发送 SIGSEGV:
kill -SEGV $(pgrep -f "nginx: worker")(注意选一个非 master 的 PID) - 检查是否生成 core:
ls -lh /var/tmp/nginx-core/core.* - 用 gdb 加载验证:
gdb $(which nginx) /var/tmp/nginx-core/core.nginx.*<br>(gdb) bt full
- 若报错
No symbol table info available,说明缺少 debug 编译;若提示Permission denied,检查目录权限或 SELinux











