Nginx 403禁止所有文件


191

我在CentOS 5盒子上安装了Nginx和PHP-FPM,但是我很难使它服务于我的任何文件-无论是否为PHP。

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

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由具有2777个文件权限的www-data:www-data拥有,但该网站无法提供任何内容-

 [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,因此它们似乎无济于事。

我在这里做了些傻事吗?


Answers:


333

一个经常被忽略的权限要求是,用户需要在文件的每个父目录中具有x个权限才能访问该文件。检查/,/ home,/ home / demo等的权限,以进行www-data x访问。我的猜测是/ home大概是770,而www-data无法通过chdir进入任何子目录。如果是这样,请尝试使用chmod o + x / home(或任何拒绝该请求的目录)。

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


6
同样在这里。在我安装的CentOS 6上,/ home / user dirs默认设置为700。
jjt 2012年

2
这个家伙也谈论它:(chmod -4 +x /mypath对我有用
Peter Ehrlich

1
有人可以解释为什么这种行为与apache不同,apache不需要每个父目录都具有“ x”权限吗?!
2014年

3
没什么不同。apache不需要父目录的x权限的唯一原因是它是否以root身份运行。
kolbyjack

我最终将www-data用户添加到我的个人用户组,并在根用户文件夹中执行了chmod 710。像魅力一样工作。(在基于Debian的发行版上)
basicdays

298

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

要检查SELinux是否正在运行:

# getenforce

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

# setenforce Permissive

重新启动Nginx,然后查看问题是否仍然存在。为了允许nginx提供您的www目录(请确保在测试前重新打开SELinux。setenforce Enforcing

# chcon -Rt httpd_sys_content_t /path/to/www

在这里查看我的答案以获取更多详细信息


1
我不知道为什么每次启动nginx时都会open() "/usr/share/nginx/logs/xxxxxx.com-error_log" failed (13: Permission denied)在检查权限并确保以root用户身份启动后说它。我碰到了这一点,发现SELinux已启用。我禁用了它,现在它没问题了。谢谢!
ub3rst4r 2014年

1
谢谢!我仍然有被拒绝的用户拥有自己的FPM插座权限的问题,所以我能够通过改变来修复一个usernginx的/var/nginx/nginx.conf-也许这将帮助别人谁碰到这个问题来。第二部分是DataPsyche的 S / O。

11
这也是CentOS 7上的默认行为。
tims

4
我和其他发表评论的人在一起。我准备把我的电脑扔到窗外。Nginx配置正确,权限设置正确,我什至竭尽所能使所有777仍然出现权限被拒绝的错误。
DOfficial 2015年

2
在Centos 7(启用SELinux)上,对我来说最简单的解决方法是 setsebool httpd_read_user_content on(对于从主目录托管的静态文件,将其更改为世界可读)-尽管我猜上面的@KapiteinWitbaard的方法更安全。
TimStaley,2016年

60

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

在nginx.conf中

worker_processes 4;
user username;

用Linux用户名更改“用户名”。


4
我认为此答案比接受的答案在安全性方面更好。您不必弄乱主文件夹(可能包含敏感信息)上的权限,并且如果您正在使用nginx进行开发,则可以避免将奇怪的文件权限上载到SCM。
CamelBlues

在主目录上添加的权限是执行的,而不是读取的,因此(理论上)不会泄露敏感信息(在这种情况下,可能是恶意PHP脚本向上传播并知道敏感文件在另一个目录中的位置)可访问www-data)。您还会注意到,在原始问题中,我的nginx以“ www-data”运行-这里的配置值已经根据需要设置。
Angus Ireland

2
还必须添加用户组:用户usegroup。
加百利A. Zorrilla 2015年

也为我工作(就像将目录更改为nginx:nginx一样)。不过,我更喜欢这种解决方案,因此我的文档根目录可以由nginx之外的其他用户拥有。感谢安德森指出这一点。
kvdv

拯救了我的一天。顺便说一句,如果机器有多个用户并且每个用户都有自己的网站,我该如何处理?
psychok7'9

38

我遇到了这个错误,最后通过下面的命令解决了这个错误。

restorecon -r /var/www/html

当您将某物从一个地方转移到另一个地方时,就会引起此问题。当您移动原始文件时,它会保留原始文件的selinux上下文,因此,如果在/ home或/ tmp中解压缩某些内容,则会获得与其位置匹配的selinux上下文。现在,您将其转换为/ var / www / html,并使用上下文说明它属于/ tmp或/ home,并且策略不允许httpd访问这些文件。

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


1
由于@jsina,这对我帮助很大
潘卡加尔格

1
该死,+ 1,我也是。
jww

23

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


1
也为我工作。我怀疑会发生这种情况,因为即使nginx以root身份启动,它也会在nginx.conf文件中指定的用户(即“用户nginx;”)下生成进程。默认。按照Anderson的建议,将用户更改为拥有您的文档根目录的用户也应起作用。
kvdv

安德森先生?没有!Andron;)
Andron 2015年

抱歉,安德伦先生;)我似乎无法再编辑以前的评论了……
kvdv

当然,不是问题。现在我和Anderson一样:),需要写一些童话故事……
Andron

1
这不是安全问题吗?
gontard '16

6

如果您使用的是SELinux,只需输入:

sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/

这将解决权限问题。


1

老问题,但我有同样的问题。我尝试了以上所有答案,但没有任何效果。不过,为我解决的问题是删除域,然后再次添加。我正在使用Plesk,并且在域已经存在之后安装了Nginx。

不过先将本地备份到/ var / www / backups。这样我就可以轻松地复制回文件。

问题很奇怪...


1

我们使用Plesk Onyx 17遇到了同样的问题。解决方案是将nginx用户添加到psacln组,而不是搞乱权限等,在该组中,所有其他域所有者(用户)是:

usermod -aG psacln nginx

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

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

usermod -aG psaserv apache

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


这是正确的答案,最有可能usermod -aG username www-data在大多数设置中使用。
达里奥·扎德罗

0

通过错误地运行setfacl命令,我对这个问题进行了细微的改动。我跑了:

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

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

sudo setfacl -b /home/foo/bar

然后,nginx能够访问文件。



0

我遇到了同样的问题,但上述解决方案没有帮助。

因此,经过大量的努力,我发现sestatus被设置为强制执行哪些操作来阻塞所有端口,并通过将其设置为宽松来解决所有问题。

sudo setenforce 0

希望这可以帮助像我这样的人。


虽然这可能已解决您的问题-恭喜!-有点可悲:-(请参阅stopdisablingselinux.com-您能找到其他解决方法吗?
Angus Ireland
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.