Я потратил несколько часов на этот вопрос и, несмотря на большое количество сообщений, связанных с этим, я не могу его решить. У меня есть блок 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 можно пройти. Что мне не хватает?
Вот несколько возможных решений:
На вашем php-fpm http://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
Обратите внимание, что приведенное выше решение (установить 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.ini!
перезагрузка службы php5-fpm или перезагрузка службы php5-fpm
fpm prearts php5, поэтому для перезапуска nginx недостаточно повторения изменений.
Для справки тех, кто приходит позже: в conf для вашего сайта попробуйте добавить: fastcgi_param PATH_INFO $ fastcgi_path_info; Также посмотрите, что делает SELinux. Чтобы отключить его: setenforce 0 Но затем укажите, что такое сценарий, и верните его в setenforce 1
Это также может произойти, если в вашем корневом документе vhost отсутствует index.php
.
Тщательно дважды проверьте параметр www_root
в вашей конфигурации nginx. Затем дважды проверьте, что файл php, который вы пытаетесь удалить, на самом деле там.
В моем случае я неправильно набрал корневой путь vhost doc и поэтому указал его на пустой каталог, давая 403.