nginx无法打开具有相同所有者,组和不太严格权限的文件

我在Nginx上运行的站点的index.php文件上收到权限被拒绝错误.错误如下:

2018/01/19 05:50:01 [error] 9664#9664: *17 FastCGI sent in stderr: "PHP message:
PHP Warning:  Unknown: failed to open stream: Permission denied in Unknown on line 0
Unable to open primary script: /var/www/the-site/index.php (Permission denied)" while
reading response header from upstream, client: xxx.xxx.xxx.xxx,
server: www.the-site.com, request: "GET /index.php HTTP/1.1",
upstream: "fastcgi://unix:/var/run/php5-fpm-the-site.sock:", host: "www.the-site.com"

文件的权限是

-rw-rw-r--. 1 root root 418 Aug  2 17:49 index.php

将文件权限更改为777(暂时)没有帮助:

-rwxrwxrwx.  1 root root   418 Aug  2 17:49 index.php

但是,如果我移动文件:

mv index.php index-old.php

并将其替换为具有以下内容的新index.php:

<?php phpinfo(); ?>

那很好用.用户和组是相同的,权限现在更弱:

$ls -l index*
-rwxrwxrwx. 1 root root 418 Aug  2 17:49 index-old.php
-rw-r--r--. 1 root root  20 Jan 19 05:56 index.php

这是ls -Z的结果:

$ls -Z index*
-rwxrwxrwx. root root unconfined_u:object_r:user_tmp_t:s0 index-old.php
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.php
最佳答案
-rw-r--r--. 1 root root  20 Jan 19 05:56 index.php
          ^ this one

权限位后面的点表示SELinux安全上下文.如果您正在运行SELinux系统,则需要匹配以便nginx可以读取该文件.您可以使用ls -Z来查看安全上下文,使用restorecon来恢复默认安全上下文(基于文件位置,我认为),或者使用chcon来更改它.

像这样的东西

$restorecon /var/www/the-site/index.php

或者这是完整目录.

$restorecon -r /var/www/the-site

(我现在无法在任何地方测试,检查语法)

见,例如, Red Hat documentation on SELinux labels

转载注明原文:nginx无法打开具有相同所有者,组和不太严格权限的文件 - 代码日志