启用 Nginx core dump 需同时配置 systemd 的 LimitCORE=infinity、内核 core_pattern 可写且路径有效、Nginx 配置中显式设置 working_directory;三者缺一不可,否则无法生成完整 core 文件。

当使用 systemd 管理 Nginx 服务时,若 Nginx 因崩溃或收到 SIGSEGV、SIGABRT 等信号而异常退出,系统可能生成 core dump 文件(即核心转储)。但默认情况下,systemd 会限制 core 文件的大小(LimitCORE=0),导致无法生成或只生成空/截断的 core 文件,影响问题排查。
确认当前 LimitCORE 设置
运行以下命令查看 Nginx 服务实际生效的 LimitCORE 值:
systemctl show nginx.service | grep LimitCORE
或更直观地检查完整资源限制:
systemctl show nginx.service --property=LimitCORE
注意:该值可能继承自 system.conf、nginx.service 本身或 override.conf,优先级以 unit 文件中定义为准。
启用 Core Dump 需要三步同时生效
-
修改 systemd 服务限制:在
/etc/systemd/system/nginx.service.d/override.conf中添加:
[Service] LimitCORE=infinity
然后执行:sudo systemctl daemon-reload && sudo systemctl restart nginx
-
确保内核允许用户生成 core:检查
/proc/sys/kernel/core_pattern是否可写且路径有效(如指向/var/lib/systemd/coredump或自定义目录),并确认目标目录存在、有写权限; -
关闭 Nginx 自身的 core 排除机制:Nginx 编译时若启用了
--with-debug,需在配置中显式开启 core dump(否则即使系统允许,Nginx 也会主动调用setrlimit(RLIMIT_CORE, ...)覆盖):
# 在 nginx.conf 的 main 上下文中添加 working_directory /var/tmp; # core 文件将生成在此目录(需存在且 nginx 用户可写)
注意:working_directory 必须显式设置,否则 core 可能因权限或路径问题被丢弃。
验证 core 是否能正常生成
手动触发一次崩溃用于测试(仅限测试环境):
- 找到 Nginx 主进程 PID:
pgrep -f "nginx: master" - 发送 ABRT 信号:
sudo kill -ABRT $PID - 检查是否生成 core 文件:
ls -l /var/tmp/core* || ls -l /var/lib/systemd/coredump/
若仍无 core,检查 dmesg | tail -20 是否提示 "coredump failed: Permission denied" 或 "truncated core dump",常见原因包括 SELinux 限制、磁盘配额、目录 noexec/nodev 挂载选项等。
安全与运维建议
生产环境不建议长期开启 LimitCORE=infinity,尤其当磁盘空间受限或请求量大时,频繁崩溃可能快速占满磁盘。推荐做法:
- 临时调试时启用,问题定位后立即关闭;
- 配合
kernel.core_pattern使用压缩或自动清理,例如:|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %h %e(由 systemd-coredump 统一处理,支持压缩与配额); - 确保
systemd-coredump已启用:sudo systemctl enable --now systemd-coredump.socket; - 定期轮转清理:
sudo coredumpctl prune或配置/etc/systemd/coredump.conf中的MaxUse=和KeepFree=。
不复杂但容易忽略——LimitCORE 只是门槛,真正起作用的是 systemd-coredump、内核策略、文件系统权限和 Nginx 自身行为的组合。











