使用Nginx + PHP-FPM访问被拒绝(403)的PHP文件

时间:2014-04-30 14:13:44

标签: nginx permissions fedora php http-status-code-403

我在这个问题上花费了几个小时,尽管与之相关的帖子数量很多,但我无法解决。我有一个配有Nginx + PHP-FPM的Fedora 20盒子,直到今天(我重新加载php-fpm.service之后)我的工作非常好。 Nginx正在提供静态文件没有问题,但任何PHP文件都会触发错误403。

权限没问题,nginx和php-fpm在用户" nginx"下运行:

root     13763  0.0  0.6 490428 24924 ?        Ss   15:47   0:00 php-fpm: master process (/etc/php-fpm.conf)
nginx    13764  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13765  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13766  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13767  0.0  0.1 490428  7296 ?        S    15:47   0:00 php-fpm: pool www
nginx    13768  0.0  0.1 490428  6848 ?        S    15:47   0:00 php-fpm: pool www

服务文件也被设置为nginx用户,我甚至结束了777那些文件的尝试,但仍然是#34;访问被拒绝"任何PHP文件。

以下是我的Nginx配置服务器:

server {
        listen          80;
        server_name     localhost;

        root            /var/www/html;

         location ~ \.php$ {
            fastcgi_intercept_errors on;
            try_files $uri =404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}

PHP-FPM池:

[www]
...
listen = 127.0.0.1:9000
user = nginx
group = nginx
...

对于版本:

php-5.5.11 (以及 php-fpm-5.5.11 当然)

的nginx-1.4.7

我正在添加Nginx错误日志:

 FastCGI sent in stderr: "Access to the script '/var/www/html' has been denied (see security.limit_extensions)" while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xxx.xxx.xxx.xxx"

确切地说security.limit_extensions是正确的,设置为:security.limit_extensions = .php

关于路径权限,可以遍历 / var / www / html 。 我错过了什么?

7 个答案:

答案 0 :(得分:38)

以下是一些可能的解决方案:

  1. 在php-fpm www.conf中设置security.limit_extensions.php.php5或适合您环境的任何内容。对于某些用户,完全删除所有值或将其设置为FALSE是使其正常工作的唯一方法。

  2. 在您的nginx配置文件中,将fastcgi_pass设置为您的套接字地址(例如unix:/var/run/php-fpm/php-fpm.sock;),而不是您的服务器地址和端口。

  3. 检查SCRIPT_FILENAME fastcgi参数并根据文件的位置进行设置。

  4. 在您的nginx配置文件中,在定位块中包含fastcgi_split_path_info ^(.+\.php)(/.+)$;,其中定义了所有其他fastcgi参数。

  5. 在您的php.ini集cgi.fix_pathinfo1

答案 1 :(得分:8)

请注意,上述解决方案(将cgi.fix_pathinfo设置为1)是糟糕的主意。有关概述,请参阅https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/

问题可能取决于依赖PATH_INFO的应用程序。启用php的访问日志记录,以获取有关如何调用应用程序的更多信息,以帮助您调试此问题。

再一次,只是为了确定 - 接受的解决方案是一个可怕的想法,并且可能会让您的网站遭到入侵。

答案 2 :(得分:2)

更改php.ini后别忘了重启php5-fpm服务!!

服务php5-fpm重启 要么 服务php5-fpm重装

fpm预启动php5所以仅重新启动nginx以进行更改是不够的。

答案 3 :(得分:0)

供以后参考者参考: 在您的网站的conf中尝试添加: fastcgi_param PATH_INFO $ fastcgi_path_info; 还要看看SELinux在做什么。关闭它:setenforce 0 但随后想出什么脚本是问题,并回到setenforce 1

答案 4 :(得分:0)

如果您的vhost文档根目录中没有index.php,也可能会发生这种情况。

仔细检查nginx配置中的www_root参数。然后仔细检查你试图点击的php文件是否真的在那里。

在我的情况下,我错误地键入了vhost doc根路径,因此将其指向一个空目录,产生一个403.

答案 5 :(得分:0)

可能与 selinux 有关。如果您使用 Virtual Box 共享文件夹,则无法在Linux中更改此文件夹中的访问权限。因此,您可以在关闭 selinux 后解决此问题。

答案 6 :(得分:0)

我遇到了同样的问题,在尝试了上述所有建议后,仍然无法正常工作。然后我检查了我的文件。显然我不是服务器专家。

原来,我有一个文件夹/ sites-available和/ sites-enabled。 我已经更新了sites-available文件夹中的默认文件,但没有更新/ sites-enabled文件夹中的默认文件。完成此操作(并重新启动nginx)之后,一切都开始工作。

花些时间解决这个问题,希望这可以帮助其他人尽快修复它。