我在CentOS 5盒子上安装了nginx和PHP- fpm,但我很难让它为我的任何文件服务——无论是PHP还是非PHP。

Nginx以www-data:www-data运行,默认的“欢迎来到Nginx on EPEL”站点(root:root拥有644权限)加载正常。

nginx配置文件有一个包含指令/etc/nginx/sites-enabled/*.conf,我有一个配置文件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得到了403,但我看到的大多数都涉及到更复杂的Ruby/Passenger设置(在过去我实际上成功了),或者只在上游PHP-FPM涉及时接收错误,所以他们似乎没有什么帮助。

我做了什么傻事吗?


当前回答

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

检查SELinux是否正在运行:

# getenforce

在下次重启之前禁用SELinux:

# setenforce Permissive

重新启动Nginx,看看问题是否仍然存在。为了允许nginx为你的www目录服务(请确保在测试之前打开SELinux)。即,setenforce强制)

# chcon -Rt httpd_sys_content_t /path/to/www

更多细节请看我的回答

其他回答

我尝试过不同的情况,只有当owner被设置为nginx (chown - r nginx:nginx "/var/www/myfolder")时,它才开始正常工作。

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

在nginx.conf

worker_processes 4;
user username;

将“username”改为Linux用户名。

如果您正在使用SELinux,只需输入:

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

这将修复权限问题。

我也面临着同样的问题,但上述解决方案并没有帮助。

因此,经过一番努力,我发现sestatus被设置为强制阻塞所有端口,并通过将其设置为允许,所有问题都得到了解决。

sudo setenforce 0

希望这能帮助到像我这样的人。

我得到了这个错误,我最终解决了下面的命令。

restorecon -r /var/www/html

这个问题是当你把东西从一个地方传到另一个地方时引起的。当您移动它时,它会保留原始文件的selinux上下文,因此如果您解tar /home或/tmp中的某个文件,它会得到一个与其位置匹配的selinux上下文。现在你把它mv到/var/www/html,它接受上下文,说它属于/tmp或/home,而httpd不被策略允许访问这些文件。

如果你cp文件而不是mv文件,selinux上下文将根据你要复制到的位置分配,而不是它来自哪里。运行restorecon将上下文恢复为默认值并修复它。