我想使用我的网络浏览器在我的服务器上列出目录。 目录是/ srv / downloads /
我安装了nginx服务器来做到这一点。这是配置文件:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
和conf.d目录中的.conf文件是:
server {
listen 80 default_server;
server_name example.org;
root /srv;
client_max_body_size 64M;
location /downloads/ {
autoindex on;
alias /srv/downloads/;
allow 192.168.0.0/24;
allow 10.212.116.0/23;
deny all;
}
}
但是当我尝试访问http://192.168.0.2/downloads/
时,我能够列出目录但不能列出所有内容。以下是发生的事情:
2015/04/21 17:08:54 [crit] 12839#0: *1 stat() "/srv/downloads/fix_kernel_doc.patch.done" failed (13: Permission denied), client: 192.168.0.26, server: example.org, request: "GET /downloads/ HTTP/1.1", host: "192.168.0.2"
如nginx.conf所示,nginx服务器由用户" nginx"运行。所以我做了以下事情:
[root@srv]# su -l nginx -s /bin/stat /srv/downloads/fix_kernel_doc.patch.done
Last login: mar. avril 21 17:30:19 CEST 2015 on pts/0
File: '/srv/downloads/fix_kernel_doc.patch.done'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 85524762 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ is) Gid: ( 1000/ devs)
Context: system_u:object_r:var_t:s0
Access: 2015-04-21 17:22:48.393259661 +0200
Modify: 2015-04-21 17:22:48.393259661 +0200
Change: 2015-04-21 17:22:48.393259661 +0200
Birth: -
我的用户nginx位于" devs"组。我还尝试使用用户www-data来确定它,但它也没有用。
请问好吗? 感谢
答案 0 :(得分:1)
根据Context: system_u:object_r:var_t:s0
,我猜你正在使用SELinux。
SELinux可能会阻止访问。要验证这是否是SELinux问题,请尝试运行setenforce 0
以暂时禁用SElinux,然后重试加载目录。或者,如果确实发生了拒绝,/var/log/audit/audit.log
应该已经记录了拒绝。
如果可行,您将不得不更改目录的上下文以允许nginx读取它,或者尝试运行audit2allow
以查看是否有SELinux布尔值您可以更改允许nginx访问。
编辑:由于它是SELinux和单个文件夹,解决此问题的最简单方法应该是运行semanage fcontext -a -t httpd_sys_content_t "/srv(/.*)?"
,然后运行restorecon -R -v /srv
。
第一个告诉SELinux / srv目录包含HTTP服务器的只读内容,第二个目录将通过并正确地重新标记所有文件。
最后,使用setenforce 1
重新启用SELinux。
来自http://www.serverlab.ca/tutorials/linux/web-servers-linux/configuring-selinux-policies-for-apache-web-servers/,https://drupalwatchdog.com/volume-2/issue-2/using-apache-and-selinux-together和http://www.techrepublic.com/blog/linux-and-open-source/practical-selinux-for-the-beginner-contexts-and-labels/
的说明Configure SELinux access so that Apache can access mounted directories是一个相关的问题。
答案 1 :(得分:0)
我遇到了这个问题,并且正在评论此文档用于文档目的。
示例:
nginx用户:www-data
location /sub {
alias /home/dir1/dir2/dir3;
autoindex on;
}
为www-data设置r + x作为dir3的组所有者返回权限被拒绝
为www-data设置r + x作为dir2的组所有者返回想要的行为
使用递归选项
设置权限