使用Nginx + PHP-FPM的PHP文件拒绝访问(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个文件的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

金银杏-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_extensionssecurity.limit_extensions = .php

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


答案 1

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

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

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

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

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

  5. 在 php 中.ini设置为cgi.fix_pathinfo1


答案 2

请注意,上述解决方案(设置为)是一个可怕的想法。请参阅 https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-don't-trust-the-tutorials-check-your-configuration/,以获得良好的概述。cgi.fix_pathinfo1

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

再一次,只是为了确定 - 公认的解决方案是一个可怕的想法,可能会让您的网站被黑客入侵。


推荐