我已经看到过几个与此相关的问题,并且几乎尝试了所有方法,但 Apache 仍然不会在生产服务器上创建核心转储。
这是在我的虚拟机上实际运行的设置:
apt-get install gdb apache2-dbg php5-dbg libapr1-dbg libaprutil1-dbg
mkdir /tmp/apache-coredumps
chmod g+w,o+w /tmp/apache-coredumps/
cat <<EOF > /etc/apache2/conf.d/debugging
CoreDumpDirectory /tmp/apache-coredumps
EOF
ulimit -c unlimited
apache2ctl -t && service apache2 restart
在虚拟机上,使用“kill -11”我可以在日志文件中看到“/tmp/apache-coredumps 中可能存在核心转储”,但是生产服务器上缺少此部分。
这也是我尝试过的:
- sysctl fs.suid_dumpable=2
- sysctl 内核.core_pattern=/tmp
- 在 Apache 的 init 脚本中设置 ulimit,如下所示https://passwd.org/2012/03/apache-httpd-core-dump-instructions
- 使用“CoreDumpDirectory /var/cache/apache2”
服务器和虚拟机都是运行 Apache 2.2.22(mpm-prefork)和 PHP 5.4.45 的 Debian Wheezy。
还有什么可能阻止核心转储的创建?
答案1
希望这对某人有帮助。
请注意,如果您已在您的(或您的系统上的任何名称)PrivateTmp=true
中设置,这意味着 Apache 实际上会在内部查找类似的内容,Apache 将无法写入该目录,并且您根本不会转储核心(由于tmp 目录具有 700 个仅限根权限)。/usr/lib/systemd/system/apache2.service
/tmp
/tmp/systemd-private-c27fc5b152d546159d675e170641529b-apache2.service-IcEt0m/
systemd
解决方案是PrivateTmp=false
在服务器启动后设置或修改 systemd tmp 目录的权限。
我在这上面浪费了几个小时,直到现在才终于意识到问题所在。
答案2
man core
有一个你应该查看的列表。第一个看起来很可能,因为/var/cache/apache2
它通常只能由 root 写入,就像是/var/www
,它是 debian 上 www-data 用户的常用主目录:
There are various circumstances in which a core dump file is not pro-
duced:
* The process does not have permission to write the core file. (By
default the core file is called core, and is created in the current
working directory. See below for details on naming.) Writing the
core file will fail if the directory in which it is to be created is
nonwritable, or if a file with the same name exists and is not
writable or is not a regular file (e.g., it is a directory or a sym-
bolic link).