Apache服务器:编辑httpd.conf文件(权限被拒绝)

8

我最近刚下载了Apache服务器及其所有文件(httpd、apr、apr-util、pcre),并按照这里的说明进行了安装:http://httpd.apache.org/docs/2.4/install.html

然而,在设置完毕后,当我尝试启动位于usr/local/bin/目录下的Apache服务器时,出现了以下提示信息:

[allen@allen-lnx ~]$ /usr/local/bin/apachectl start
(13)Permission denied: AH00091: httpd: could not open error log file /usr/local/logs/error_log.
AH00015: Unable to open logs

经过一些研究,我发现需要编辑我的httpd.conf文件。之前我已经编辑了该文件以允许正确的ServerName和Listen选项。但是,我不确定如何编辑我的conf文件以允许访问“logs”目录。
值得注意的是,当我使用“sudo”命令时,该命令将运行,但我不希望总是使用该命令,因为它似乎是一个变通方法。
任何帮助都将不胜感激。谢谢!
编辑:实际上,我注意到可能有两个httpd.conf文件,这证明有点棘手。另一个位于我的根/ etc /目录中(etc / httpd / conf / httpd.conf)。我认为我修改后的问题是...我应该保留哪一个? / etc /版本是否内置,如faff的评论所示?
当前解决方案:我想我会接受这样一个事实,即在编辑此文件时需要使用sudo,因为我需要成为root。我可能稍后会更改它,以便我始终作为root运行,但现在,sudo就足够了。

这是哪个Linux发行版?通常最好通过操作系统的软件包管理器安装apache。这样可以让你及时更新安全补丁,并确保它与系统的其余部分正确集成,以确保为你的设置正确配置。 - faffaffaff
我正在运行Oracle Linux 6.4。这有帮助吗? - Zhouster
为什么不能使用 Oracle Linux 所提供的 Apache?查看 http://public-yum.oracle.com/repo/OracleLinux/OL6/4/base/x86_64/,似乎有可用的 Apache HTTPD 2.2.15 构建,例如 httpd-2.2.15-26.0.1.el6.x86_64.rpm 等。 - faffaffaff
我使用了“sudo yum install httpd”命令,它显示一切都是最新的。 :X - Zhouster
4个回答

5
这似乎是文件系统权限问题。请确保/usr/local/logs/目录存在,并且可以被您运行Apache的用户写入。
如果不希望普通用户能够写入您的logs目录,您可以创建日志文件:
sudo touch /usr/local/logs/error_log

然后把文件的所有者更改为正确的用户:

sudo chown allen /usr/local/logs/error_log

假设您想将Apache作为用户allen运行。
如果您想更改Apache日志文件的位置,请查找httpd.conf文件中的ErrorLog指令(如果没有,则必须添加它):
ErrorLog path/to/logfile

有没有办法在httpd.conf文件中完成这个操作?还是必须采用更“手动”的方式?因为我觉得如果我创建新文件,可能需要再次更改权限,而修复配置文件将直接解决此问题。除非我错了... - Zhouster
另外,当我尝试上述操作时,它可以运行而没有错误,但是我检查了一下,发现服务器实际上并没有启动。我知道这是因为当我尝试停止它时,它会显示“httpd(无pid文件)未运行”。调用“sudo”是我解决所有问题的方法,但我想知道是否有什么我忽略的东西... - Zhouster
@Zhouster - 当你启动服务器时,日志文件中是否有任何内容?通过查看日志文件,你应该能够看到出了什么问题。另外,我在我的回答中添加了更改默认日志文件位置的说明。 - Esenti
我已经更改了PidFile指令的位置,但是现在,当我尝试查看我正在侦听的IP地址时,我的htdcos中的index.html文件没有显示出来。因此,我将ServerName设置为127.0.0.1:8000,并将Listen设置为相同的值。是否存在任何潜在错误? - Zhouster
谢谢Essenti。我加入了你的ErrorLog建议,你的其他评论帮助我更好地理解了Apache。 :) - Zhouster
显示剩余2条评论

3
如果您正在使用SELinux,如果您删除了文件夹或遇到类似的问题,则可能需要执行以下几个步骤:
使用以下命令重新链接文件夹:ln -s /var/log/httpd /etc/httpd/logs。默认情况下,日志保存在var文件夹下,但是在/etc/httpd/logs文件夹中引用。
使用以下命令应用SELinux安全权限:chcon system_u:object_r:httpd_config_t:s0 /etc/httpd/logs
当然,要以管理员身份运行所有内容。

2
谢谢!我的权限是正确的,但是却没有起作用。在看到你的答案之前,我花了一个多小时寻找解决方案。这个(SELinux)正是我的问题所在。那个chcon对我来说没有起作用。所以我执行了set enforce 0 - M-D
想确认SELinux阻止了我的Fedora 22上的httpd服务器运行。对于使用SELinux的系统,这仍然是一个有效的解决方案。 - J.W.F.

0
对于那些被SElinux策略卡住的人,我成功地通过创建自定义策略来解决了这个问题。
基本上,我想把/var/log/httpd移动到我的/r/目录下的自己的目录中。
所以我运行了以下命令:
semanage fcontext -a -t httpd_sys_content_t "/r/www(/.*)?"
semanage fcontext -a -t httpd_log_t "/r/logs(/.*)?"

restorecon -Rv /z/logs/
restorecon -Rv /z/www/

service httpd restart
# worked

0

将SELinux安全策略更改为宽容模式,解决了我的问题。

在修复之前,我的SELinux使用强制模式:

$ sestatus -v
sestatus -v
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      30

我在SELinux配置文件和系统中更改了安全策略。

#/etc/selinux/config
SELINUX=permissive

# In terminal set SELinux to run in permissive mode.
$ setenforce 0

修复后,我的SELinux可以在强制模式下工作:

$ sestatus -v
SELinux status:                 enabled
Current mode:                   permissive
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接