Nginx 403 forbidden for all files
我在Centos5上安装了nginx和php-fpm,但是我很难让它为我的任何文件服务——不管是php还是php。
nginx以www-data:www-data的形式运行,默认的"欢迎使用epel上的nginx"站点(由具有644权限的root:root拥有)加载良好。
nginx配置文件有一个include指令用于/etc/nginx/sites enabled/*.conf,我有一个配置文件example.com.conf,因此:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | server { listen 80; Virtual Host Name server_name www.example.com example.com; location / { root /home/demo/sites/example.com/public_html; index index.php index.htm index.html; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param SCRIPT_FILENAME /home/demo/sites/example.com/public_html$fastcgi_script_name; include fastcgi_params; } } |
尽管public_html由www data:www data拥有2777个文件权限,但此网站无法提供任何内容-
1 | [error] 4167#0: *4 open()"/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request:"GET /index.html HTTP/1.1", host:"www.example.com" |
号
我发现了许多其他的帖子,用户从nginx得到403,但是我看到的大多数帖子要么涉及到Ruby/Passenger的更复杂的设置(在过去我实际上已经成功了),要么只在涉及上游php-fpm时接收到错误,所以它们似乎没有什么帮助。
我在这里做了些傻事吗?
一个经常被忽略的权限要求是,用户需要文件的每个父目录中的X权限来访问该文件。请检查/、/home、/home/demo等的权限,以获取www数据x访问权限。我猜/home可能是770,WWW数据不能通过它访问任何子目录。如果是,请尝试chmod o+x/home(或dir拒绝该请求的任何内容)。
编辑:为了方便地显示路径上的所有权限,可以使用
如果在验证父文件夹的权限后仍然看到
要检查SELinux是否正在运行:
1 | # getenforce |
要禁用SELinux直到下次重新启动:
1 | # setenforce Permissive |
号
重新启动nginx,查看问题是否依然存在。要允许nginx为您的www目录服务(在测试之前,请确保重新打开selinux)。即,
1 | # chcon -Rt httpd_sys_content_t /path/to/www |
详情请参阅我的答案。
我通过添加用户设置解决了这个问题。
在nginx.conf中
1 2 | worker_processes 4; user username; |
。
用Linux用户名更改'user name'。
我得到了这个错误,最后用下面的命令解决了它。
1 | restorecon -r /var/www/html |
。
这个问题是由你从一个地方到另一个地方的mv信号引起的。当您移动它时,它会保留原始的selinux上下文,因此如果您在/home或/tmp中解开某些内容,它会得到一个与其位置匹配的selinux上下文。现在,您可以将其转发到/var/www/html,并在上下文中声明它属于/tmp或/home,策略不允许httpd访问这些文件。
如果cp文件而不是mv文件,则selinux上下文将根据要复制到的位置而不是从何处来分配。运行restorecon会将上下文放回其默认值并对其进行修复。
我尝试过不同的案例,只有当所有者设置为nginx(
老问题,但我也有同样的问题。我试过上面的每一个答案,都没用。不过,修复它的方法是删除域,然后重新添加。我正在使用Plesk,在域已经存在之后安装了nginx。
首先对/var/www/backups进行了本地备份。所以我可以很容易地把文件复制回去。
奇怪的问题……
如果您使用SELinux,只需键入:
1 | sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/ |
。
这将解决权限问题。
如果您使用的是php,请确保服务器块中的
埃多克斯1〔8〕
有关更多信息,请签出官方文档中的index指令。
我们有同样的问题,使用Plesk Onyx 17。解决方案不是搞砸权限等,而是将nginx用户添加到psacln组中,其中所有其他域所有者(用户)都是:
1 | usermod -aG psacln nginx |
现在nginx有权访问.htaccess或正确显示内容所需的任何其他文件。
另一方面,还要确保Apache在psaserv组中,以提供静态内容:
1 | usermod -aG psaserv apache |
。
之后别忘了重启Plesk中的Apache和nginx!(并使用ctrl-f5重新加载页面)
在这个问题上,我错误地运行了
1 | sudo setfacl -m user:nginx:r /home/foo/bar |
。
我放弃了这条路径,转而将
1 | sudo setfacl -b /home/foo/bar |
然后nginx可以访问这些文件。
我也面临同样的问题,但以上的解决办法没有帮助。
所以,经过一番斗争,我发现塞斯塔斯将强制执行封锁所有港口的措施,并将其设置为允许,所有问题都得以解决。
1 | sudo setenforce 0 |
希望这能帮助像我这样的人。