Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вот несколько возможных решений:

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

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

  • Проверьте свой параметр SCRIPT_FILENAME fastcgi и установите его в соответствии с расположением ваших файлов.

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

  • В вашем наборе php.ini cgi.fix_pathinfo - 1

Ответ 2

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

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

Ответ 3

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

перезагрузка службы php5-fpm или перезагрузка службы php5-fpm

fpm prearts php5, поэтому для перезапуска nginx недостаточно повторения изменений.

Ответ 4

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

Ответ 5

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

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

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