如何在错误日志中确定apache“无法打开以供读取”的文件

时间:2012-09-13 13:55:31

标签: apache logging permissions

我的apache错误日志已满

Error opening file for reading: Permission denied
Error opening file for reading: Permission denied
Error opening file for reading: Permission denied

如何确定导致此权限错误的文件的文件或文件夹?出现的错误与access_log请求之间没有直接关系。

Googling suggests我应该使用 strace ,但是当我这样做时

strace apache2 

strace -etrace:open apache2

响应很冗长,因为之前我还没有成功使用过这个工具,我不知道该找什么。这是一个出现的痕迹。

.....
open("/lib/x86_64-linux-gnu/libnss_nis.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
apache2: bad user name ${APACHE_RUN_USER}

最后一行是唯一似乎可能是原因的行,但我的网络服务器正在处理图像,以及如果apache用户不够用的各种磁盘问题。

感谢。

2 个答案:

答案 0 :(得分:2)

我对strace不是很了解,但我认为你需要做一些其他的事情来让Apache按你的意愿运行。

如果您只运行apache2二进制文件,您的程序将停止(如您所知)用户名错误,因为通常将apache用户名/组设置为配置的一部分(在我的Ubuntu上的/ etc / apache2 / envvars中) 12.04安装)。

我发现最容易的是在我的机器上找到apachectl脚本,并搜索“start”。你会发现一行如下:

$HTTPD ${APACHE_ARGUMENTS} -k $ARGV

你可以在这里添加你的strace,看起来像:

strace -etrace:open -f $HTTPD ${APACHE_ARGUMENETS} -k $ARGV

你需要包含-f选项,因为apache会产生许多进程,你想最有可能追踪它们,至少这对我有用:)

答案 1 :(得分:0)

您需要查找open()的调用,这会导致返回值-1,错误= = EACCES。

我不得不在ubuntu上调整以下strace命令行(在/ usr / sbin / apachectl中):

strace -o /tmp/strace.log -e trace=open -f $HTTPD ${APACHE_ARGUMENTS} -k $ARGV

-o将输出存储在文件中。如果您担心在每个人都可读的区域中泄漏文件名,请使用适当的目标目录。

我自己在运行apache mod wsgi的python程序中追逐类似的bug。我找到了这些......

3556  open("/proc/self/auxv", O_RDONLY) = -1 EACCES (Permission denied)

我认为我的错误与wsgi工作进程将权限从root权限下降到运行应用程序的常规用户这一事实有关,但在权限下降后,/proc/self/auxv仍然无法读取常规进程。 - 也许。