尽管文件系统权限正确,但 nginx 仍无法打开(并提供)文件

尽管文件系统权限正确,但 nginx 仍无法打开(并提供)文件

在 Fedora 20 上全新安装 nginx 1.4.7 后,我在默认位置添加了两个附加位置:

user  neradis; # I also tried the 'root' user here and commenting this directive out, to no avail
worker_processes  1;

[...]
http {

include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

sendfile        on;

[...]

index   index.html index.htm;

server {
    listen       80;
    server_name  localhost;
    root         /usr/share/nginx/html;
autoindex    on;

    location /music/ {
        root    /home/neradis/audio;
    autoindex    on;     
}

location /nginx_test/ {
        root /;  
    autoindex on;
}


    error_page  404              /404.html;
    location = /40x.html {
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    }
}
}

/usr/share/nginx/htmlnginx可以毫无问题地从默认位置提供文件,但对于添加的位置会产生拒绝文件系统操作权限的错误( open()opendir())。我知道每个父目录都必须是 nginx 使用的用户的“可执行文件”,因此我确保使用namei -l

f: /nginx_test/file.txt
drwxr-xr-x root    root    /
drwxrwxrwx neradis neradis nginx_test
-rwxrwxrwx neradis neradis file.txt

尽管如此,我仍然收到 403 响应wget localhost/nginx_test/file.txt,并在日志中发现此错误:

[error] 6950#0: *1 open() "/nginx_test/file.txt" failed (13: Permission denied), client: 127.0.0.1, server: localhost, request: "GET /nginx_test/file.txt HTTP/1.1", host: "localhost"

我得到了同样的错误/home/neradis/audio/music。我很困惑,与正常运行的默认根目录的关键区别/usr/share/nginx/html是什么:

f: /usr/share/nginx/html/index.html
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root share
drwxr-xr-x root root nginx
drwxr-xr-x root root html
-rw-r-xr-x root root index.html

还有什么其他想法可能会阻止 nginx 访问文件?

编辑(解决方案):这些评论为我指明了正确的方向。文件权限没问题,但 SELinux 阻止读取新位置的文件,因为它们具有 (SELinux) 类型default_tuser_home_t,而 是被禁止的httpd_t。我编写了自己的 selinux 模块以允许default_t文件,并使用 启用了对主文件的访问setsebool -P http_read_user_content

答案1

位置的文件是否/music/位于/home/neradis/audio/music目录中?如果不是,那么您应该使用别名:

location /music {
    alias /home/neradis/audio;
}

这是 nginx 配置中最常见的陷阱之一,即root在位置中使用指令,而实际上却alias是正确的。

nginx 在位置内指定的目录后面添加匹配的位置 URI root,而使用alias,URI 会被剥离。

答案2

nginx 使用的默认用户是 www-data 用户,而不是 root。您也可以创建另一个用户,并将其添加到 www-data。

添加其他位置时,我建议您:

  • 创建一些其他虚拟主机,并且不要使用默认虚拟主机。
  • 将您的数据放在 www-data 可读取/写入的目录中,例如 /var/www。

相关内容