要让 Nginx 崩溃时生成 core dump 文件,需配置系统级 core dump 机制:启用 ulimit -c unlimited、设置 kernel.core_pattern、确保目录权限,并为 systemd 的 nginx 服务配置 LimitCORE=infinity。

要让 Nginx 在崩溃时生成 core dump 文件,关键不是靠 working_directory(Nginx 配置中根本不存在这个指令),而是正确配置操作系统级的 core dump 机制,并确保 Nginx 进程有权限写入指定目录。Nginx 自身不提供类似 working_directory 的指令来控制 core dump 路径。
确认系统允许生成 core dump
Linux 默认通常禁用 core dump,需手动开启:
- 临时启用(当前会话有效):
ulimit -c unlimited - 永久启用(推荐):
编辑/etc/security/limits.conf,添加两行:* soft core unlimited* hard core unlimited
注意:需重启用户会话或重新登录生效;若 Nginx 由 systemd 管理,还需在 service 文件中显式设置
设置 core dump 保存路径和命名格式
Linux 通过 /proc/sys/kernel/core_pattern 控制 core 文件生成位置和文件名:
- 查看当前设置:
cat /proc/sys/kernel/core_pattern - 临时修改(例如存到
/var/log/nginx/core/,按进程名+PID 命名):echo '/var/log/nginx/core/core.%e.%p' | sudo tee /proc/sys/kernel/core_pattern - 永久生效:写入
/etc/sysctl.conf:kernel.core_pattern = /var/log/nginx/core/core.%e.%p
然后运行sudo sysctl -p - 确保目标目录存在且 Nginx 工作用户(如
www-data或nginx)有写权限:sudo mkdir -p /var/log/nginx/coresudo chown www-data:www-data /var/log/nginx/coresudo chmod 755 /var/log/nginx/core
检查并适配 systemd(如使用 systemctl 启动 Nginx)
systemd 会覆盖 ulimit 和部分内核参数,需单独配置:
- 编辑 Nginx service 文件:
sudo systemctl edit nginx - 添加以下内容:
[Service]
LimitCORE=infinity
TasksMax=infinity - 重载并重启:
sudo systemctl daemon-reloadsudo systemctl restart nginx
验证 core dump 是否正常工作
手动触发一次崩溃(仅限测试环境):
- 找到主进程 PID:
sudo nginx -t && sudo systemctl status nginx | grep 'Main PID' - 向主进程发送 SIGSEGV 信号:
sudo kill -SEGV - 检查是否生成 core 文件:
ls -lh /var/log/nginx/core/ - 用
gdb加载验证:gdb $(which nginx) /var/log/nginx/core/core.nginx.*











