Apache子进程出现段错误,无法获取core dump文件排查根源
首先,你已经做了基础配置但仍拿不到core dump,大概率是权限、进程限制继承或者系统全局core配置的问题,咱们一步步来拆解:
确认CoreDumpDirectory的权限与有效性
先确保Apache运行的用户(通常是www-data)对/tmp目录有读写权限——虽然/tmp默认是777,但有些系统可能给它加了noexec或特殊ACL限制。另外,重启Apache后,一定要检查错误日志(比如/var/log/apache2/error.log),看有没有类似Core dump directory is '/tmp'的确认信息;如果有报错,说明配置位置不对(比如误放到了虚拟主机段,应该放在全局配置区)。检查Apache进程的实际ulimit限制
你手动执行ulimit -a只是当前shell的设置,但Apache如果是通过systemd或init脚本启动的,并不会继承这个shell的限制。比如systemd默认会重置core文件大小限制:- 查看Apache的systemd基础配置:
cat /lib/systemd/system/apache2.service - 如果里面没有
LimitCORE=infinity,创建override文件修改:systemctl edit apache2.service,添加以下内容:[Service] LimitCORE=infinity - 重新加载配置并重启Apache:
systemctl daemon-reload && systemctl restart apache2
最后用cat /proc/$(pidof apache2)/limits | grep "Max core file size"验证限制是否真的生效。
- 查看Apache的systemd基础配置:
检查系统全局Core Dump配置
很多现代Linux系统用systemd的coredumpctl统一收集core文件,不会直接写到你指定的/tmp目录。先查看全局core模式:cat /proc/sys/kernel/core_pattern如果输出是类似
|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h的管道命令,说明core文件被systemd收集了,你可以这样导出:- 列出Apache相关的core记录:
coredumpctl list apache2 - 找到对应进程的PID,导出到
/tmp:coredumpctl dump <PID> --output=/tmp/apache_core.dump
- 列出Apache相关的core记录:
退而求其次:不依赖Core Dump排查PHP模块
如果以上方法还是拿不到core dump,你可以直接从PHP模块入手缩小范围:- 先禁用所有非必要的PHP模块,修改
php.ini或Apache的PHP配置段,只保留最基础的模块(比如php_core、php_pdo) - 重启Apache,观察是否还出现段错误
- 如果恢复正常,再逐个启用之前禁用的模块,每次重启后测试,直到段错误重现,就能定位到出问题的模块
- 先禁用所有非必要的PHP模块,修改
内容的提问来源于stack exchange,提问作者Oleg Bolden

