httpd
我尝试在运行 Fedora 26 Server 的 Digital Ocean Droplet 上使用 apache 设置虚拟主机。我遵循了以下教程:如何在 CentOS 7 上设置 Apache 虚拟主机,假设 Fedora 和 CentOS 之间有相似之处。我按照教程设置了这个虚拟主机,如下所示:
<VirtualHost *:80>
ServerName www.mywebsite1.com
ServerAlias mywebsite1.com
DocumentRoot /var/www/html/mywebsite1.com/public_html
ErrorLog /var/www/html/mywebsite1.com/log/error_log
CustomLog /var/www/html/mywebsite1.com/log/requests_log combined
</VirtualHost>
但是设置好之后,却无法启动,后来查了一下错误日志httpd
,原来是这个错误导致的:httpd
(13)Permission denied: AH00091: httpd: could not open error log file /var/www/html/mywebsite1.com/log/error_log.
AH00015: Unable to open logs
于是我查找了解决方案,发现可能是 SELinux 策略的问题。使用ls -lZ /var/www/html/mywebsite1.com
,打印出当前的策略如下:
total 8
drwxr-xr-x. 2 apache apache unconfined_u:object_r:httpd_sys_content_t:s0 4096 Oct 1 09:54 log
drwxr-xr-x. 2 apache apache unconfined_u:object_r:httpd_sys_content_t:s0 4096 Oct 1 09:14 public_html
我跟着为 Apache Web 服务器配置 SELinux 策略并尝试将httpd_log_t
策略添加到./log
文件夹,并使用了这些:
$ semanage fcontext -a -t httpd_log_t "/var/www/html/mywebsite1.com/log(/.*)?"
$ restorecon -Rv /var/www/html/mywebsite1.com
但是,log
文件夹仍然没有httpd_log_t
应用策略,httpd
仍然无法启动,错误与之前相同。我甚至尝试使用 设置public_html
文件夹httpd_sys_rw_content_t
,但没有成功。
我认为政策制定过程可能存在问题。但我找不到任何可行的解决方案。我在这个过程中是否遗漏了什么?非常感谢您的帮助!
答案1
我发现问题是未创建 vhost 配置中指定的两个日志文件,并且似乎httpd
没有能力以某种方式创造它。
所以我
- 创建一个空
error_log
的,requests_log
/var/www/html/mywebsite1.com/log/
- 重新执行
$ semanage ...
和$ restorecon ...
命令,以获得正确的输出:
。
Relabeled /var/www/html/mywebsite1.com/log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0
Relabeled /var/www/html/mywebsite1.com/log/error_log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0
Relabeled /var/www/html/mywebsite1.com/log/requests_log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0
重启后httpd
,一切正常!网站恢复可访问,并且这些日志文件现在正在保存日志。
答案2
我认为您需要特定类型的强制执行。
- 首先检查
/var/log/audit/audit.log
特定的拒绝错误消息。您可以运行以下命令:
sealert -a /var/log/audit/audit.log
- 然后针对特定的错误消息运行 grep 并通过 audit2allow 传输它。
grep myerror /var/log/audit/audit.log|audit2allow -v
这将输出您需要的特定类型强制。