在 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/html
nginx可以毫无问题地从默认位置提供文件,但对于添加的位置会产生拒绝文件系统操作权限的错误( 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_t
和user_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。