Доступ запрещен (403) для PHP файлов с Nginx + PHP-FPM

Я потратил несколько часов на этот вопрос, и, несмотря на большое количество сообщений, связанных с ним, я не могу его решить. У меня есть коробка Fedora 20 с Nginx + PHP-FPM, которая работала довольно хорошо до сегодняшнего дня (после перезагрузки php-fpm.обслуживание я предполагаю). 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 также, я даже закончил chmoding 777 эти файлы, чтобы попробовать, но все же "Доступ запрещен" для любых файлов 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 можно пройти. Что я упускаю?

6 ответов


вот некоторые возможные решения:

  1. в вашем php-fpm www.conf set security.limit_extensions до .php или .php5 или все, что подходит вашей среде. Для некоторых пользователей полностью удалите все значения или установите его в FALSE был единственный способ заставить его работать.

  2. в вашем конфигурационном файле nginx set fastcgi_pass на ваш адрес сокета (например,unix:/var/run/php-fpm/php-fpm.sock;) вместо адреса сервера и порта.

  3. проверить SCRIPT_FILENAME FastCGI param и установите его в соответствии с местоположением ваших файлов.

  4. в конфигурационный файл nginx включить fastcgi_split_path_info ^(.+\.php)(/.+)$; в блоке местоположения, где определены все остальные параметры fastcgi.

  5. в вашем php.ini set cgi.fix_pathinfo to 1


обратите внимание, что вышеуказанное решение (set 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, чтобы получить дополнительные сведения о вызове приложения для отладки этой проблемы.

раз опять же, просто чтобы быть уверенным - принятое решение является Грозный идея, и, скорее всего, ваш сайт будет взломан.


Не забудьте перезапустить службу php5-fpm после изменения php.Ини!!

сервис рнр5-бутадиен-перезагрузка или услуги в php5-бутадиен-перезагрузка

бутадиен prestarts рнр5 так это не достаточно, чтобы перезапустить nginx для применения изменений.


для справки о тех, кто придет позже: В conf для вашего сайта старайтесь добавлять: fastcgi_param переменной path_info $fastcgi_path_info; Также посмотрите, что делает SELinux. Чтобы отключить его: setenforce 0 Но тогда выясните, какой скрипт является проблемой и верните setenforce 1


Это также может произойти, если нет index.php в корне документа vhost.

Внимательно проверьте www_root параметр в конфигурации nginx. Затем дважды проверьте, что файл php, который вы пытаетесь ударить, на самом деле там.

в моем случае я неправильно набрал корневой путь vhost doc и поэтому указал его на пустой каталог, получив 403.


Это может быть связано с настройки SELinux. Если вы используете общий папку of Виртуальный Бокс, вы не можете изменить разрешения доступа в этой папке в Linux. Таким образом, вы можете решить после закрытия настройки SELinux.