首页 文章

Nginx 403禁止所有文件

提问于
浏览
165

我在CentOS 5机器上安装了带有PHP-FPM的nginx,但我很难让它为我的任何文件服务 - 无论是否PHP .

Nginx作为www-data:www-data运行,默认的“欢迎使用EPEL上的nginx”站点(由root拥有:具有644权限的root)加载正常 .

nginx配置文件有/etc/nginx/sites-enabled/*.conf的include指令,我有一个配置文件example.com.conf,因此:

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文件权限,但该网站无法提供任何内容 -

[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获得403s,但我见过的大部分都涉及使用Ruby / Passenger进行更复杂的设置(过去我实际上已成功)或者只是在上游PHP时收到错误-FPM参与其中,所以他们似乎没什么帮助 .

我在这做过傻事吗?

9 回答

  • 253

    经常被忽视的一个权限要求是用户在文件的每个父目录中需要x权限才能访问该文件 . 检查/,/ home,/ home / demo等对www-data x access的权限 . 我的猜测是/ home可能是770而www-data不能通过它来获取任何子目录 . 如果是,请尝试chmod o x / home(或任何dir拒绝请求) .

    编辑:要轻松显示路径上的所有权限,您可以使用 namei -om /path/to/check

  • 23

    如果在验证父文件夹的权限后仍然看到 permission denied ,则可能是 SELinux 限制访问 .

    要检查SELinux是否正在运行:

    # getenforce
    

    要在下次重新启动之前禁用SELinux:

    # setenforce Permissive
    

    重新启动Nginx并查看问题是否仍然存在 . 允许nginx为你的www目录服务(确保你在测试之前重新打开SELinux . 即, setenforce Enforcing

    # chcon -Rt httpd_sys_content_t /path/to/www
    

    有关详细信息,请参阅我的answer here

  • 301

    我通过添加用户设置解决了这个问题 .

    在nginx.conf中

    worker_processes 4;
    user username;
    

    用linux用户名更改'username' .

  • 20

    我有这个错误,我终于用下面的命令解决了它 .

    restorecon -r /var/www/html
    

    当你从一个地方到另一个地方的东西时会引起这个问题 . 当你移动它时,它会保留原始的selinux上下文,所以如果你解压缩/ home或/ tmp中的某些内容,它会获得与其位置匹配的selinux上下文 . 现在你将它转移到/ var / www / html,它会将上下文称为属于/ tmp或/ home,并且策略不允许httpd访问这些文件 .

    如果您使用cp文件而不是mv它们,则会根据您要复制的位置来分配selinux上下文,而不是来自它的位置 . 运行restorecon会将上下文恢复为默认值并修复它 .

  • 0

    我尝试了不同的情况,只有当所有者设置为nginx( chown -R nginx:nginx "/var/www/myfolder" )时 - 它才开始按预期工作 .

  • 1

    老问题,但我遇到了同样的问题 . 我试过上面的每个答案,没有任何效果 . 为我修复它的原因是删除域名并再次添加域名 . 我正在使用Plesk,我已经安装了Nginx域名 .

    是否先将本地备份到/ var / www / backups . 所以我可以轻松复制文件 .

    奇怪的问题....

  • 0

    错误地运行了 setfacl 命令,我在这个问题上挖了一个轻微的变体 . 我跑了:

    sudo setfacl -m user:nginx:r /home/foo/bar
    

    我放弃了这条路线,转而将 nginx 添加到 foo 组,但该自定义ACL阻止了nginx尝试访问该文件 . 我通过运行清除它:

    sudo setfacl -b /home/foo/bar
    

    然后nginx能够访问这些文件 .

  • 0

    我们有同样的问题,使用Plesk Onyx 17.解决方案是将nginx用户添加到psacln组中,其中所有其他域所有者(用户)都是:

    usermod -aG psacln nginx
    

    现在,nginx有权访问.htaccess或正确显示内容所需的任何其他文件 .

    另一方面,还要确保Apache在psaserv组中,以提供静态内容:

    usermod -aG psaserv apache
    

    并且不要忘记在Plesk之后重启Apache和Nginx! (并使用Ctrl-F5重新加载页面)

  • 46

    如果您使用的是PHP,请确保服务器块中的 index NGINX指令包含index.php:

    index index.php index.html;

    有关更多信息,请查看官方文档中的index directive .

相关问题