为什么 Nginx 可以从默认目录正确地提供文件,但却不能从新目录提供文件?

为什么 Nginx 可以从默认目录正确地提供文件,但却不能从新目录提供文件?

安装

操作系统:CentOS 7.4

服务器:Nginx 1.12.2


问题:我的 nginx 安装可以从默认目录 提供文件,没有任何问题/usr/share/nginx/html。不幸的是,当我使用自己创建的新文件夹 时,出现了 403 错误/www/html。我应该查找什么?

尽管所有者不同,但我对两个文件夹的权限是相同的。

原始默认文件夹

drwxr-xr-x. 13 root root 155 Jan 8 09:25 usr

新的默认文件夹

drwxr-xr-x. 3 first first 18 Jan 15 10:45 www

我正在使用下面的精简nginx.conf文件并且它可以正常工作。

events {}

http {

    server {
        listen       80;
        server_name  mydomain.com;
        root         /usr/share/nginx/html;
    }

}

但是,当我更改nginx.conf为使用该目录时/www/html,出现 403 错误。

提前感谢大家的帮助!我是菜鸟,甚至不知道除了文件权限之外还要看哪里。


更新

SELinux 以强制模式启用。

[first@centos-2gb-sfo1-01 log]$ sestatus
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:      28

第二次更新 我已更新nginx.conf以包含错误日志。

events {}

http {

    server {
        listen       80;
        server_name  projournal.com;
        root         /www/html;
        error_log    /var/log/nginx.error.log;
    }

}

nginx.error.log在正确的目录中创建,但出现几次 403 错误后它仍然是空白的。

答案1

随着 SELinux 的强制执行,httpd 将被拒绝访问 /www/html,因为文件没有正确的上下文。

matchpathcon /www/html
/www/html       system_u:object_r:default_t:s0

如果您确实想使用 /www/html,那么您可以向数据库添加适当的路径上下文

semanage fcontext -a -t "httpd_sys_content_t" /www/html(/.*)?

但是,有许多可以使用的默认位置已经定义了正确的上下文,例如 /var/www/html、/srv/www 等。

当您创建 /srv/www 时,您需要首先设置它的 SELinux 上下文,之后(通常)任何新文件和目录都会具有正确的上下文。

restorecon -v /srv/www

将“修复”/srv/www。但是您已经填充了 /srv/www,因此您需要为整个树设置文件上下文

restorecon -Rv /srv/www

相关内容