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


Access denied (403) for PHP files with Nginx + PHP-FPM

我已经花了几个小时在这个问题上,尽管有很多与之相关的帖子,但我无法解决它。我有一个带有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这些文件的chmoding尝试,但对任何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。我错过了什么?

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

  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_pathinfo设置为1

请注意,上述解决方案(将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的访问日志记录,以获取有关如何调用应用程序以帮助您调试此问题的更多信息。

再一次,可以肯定的是,公认的解决方案是一个可怕的想法,很可能会让你的网站被黑客入侵。

更改php.ini后,不要忘记重新启动php5-fpm服务!!

服务php5-fpm重新启动或服务php5-fpm重新加载

fpm预启动php5,所以仅仅重新启动nginx来应用更改是不够的。

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

供稍后参考:在站点的conf中,尝试添加:fastcgi_param PATH_INFO$fastcgi_PATH_INFO;还可以看看SELinux在做什么。关闭它:setenforce 0但是,然后弄清楚问题出在哪个脚本上,并将其放回setenforce 1

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

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

在我的例子中,我错误地键入了vhost-doc根路径,因此将其指向一个空目录,得到403。

我遇到了同样的问题,在尝试了上面的所有建议后,仍然没有成功。然后我检查了我的档案。显然我不是服务器专家。

事实证明,我有一个文件夹/站点可用和/站点已启用。我更新了站点可用文件夹中的默认文件,但没有更新/sites-enabled文件夹中的文件。在这样做之后(以及重新启动nginx(,一切都开始工作了。

我花了一些时间来解决这个问题,我希望这能帮助其他人更快地解决它。