
FastCGI это высокопроизводительный и масштабируемый интерфейс для взаимодействия веб-сервера и приложений, дальнейшее развитие технологии CGI, однако CGI-скрипты перезапускаются с каждым запросом сервера, что существенно снижает производительность; FastCGI оставляет процессы запущенными и только передает им новые запросы.
nginx имеет собственную поддержку технологии FastCGI для работы с внешними серверами и утилитами. PHP тоже поддерживает FastCGI и может быть использован для обработки FastCGI-запросов от nginx.
В данном примере мы рассмотрим связку nginx и PHP-FPM. Для начала необходимо их установить, в большинстве дистрибутивах для установки есть пакеты с одноимёнными названиями. Или, например в Gentoo, для установки необходим USE флаг fpm, более подробно смотрите в документации к своему дистрибутиву.
Есть много руководств по настройке nginx для работы с PHP FPM, но многие из них являются неполными (неправильно обрабатывается переменная PATH_INFO) или содержат ошибки в обработке сценариев безопасности (отсутствует проверка наличия PHP кода в php файле).
Настроить подключение nginx и PHP-FPM можно двумя способами - либо через TCP‑порт (127.0.0.1:9000), либо unix сокет (/var/run/php-fpm.sock).
FastCGI параметры
Первая рекомендация - храните все типовые настройки FastCGI в отдельном файле и, при необходимости, импортируйте их.
Например для Debian и Ubuntu настройки по умолчанию находятся в файле /etc/nginx/fastcgi_params, который должен выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
Подключаем Nginx к PHP FPM
Тут мы должны сказать Nginx`у, чтобы проксировал запросы к PHP FPM через протокол FCGI:
1 2 3 4 5 6 7 8 9 10 | |
В параметрах php-fpm.conf за подключение отвечает параметр listen.
1 2 3 4 | |
В варианте подключения через unix сокет fastcgi_pass будет таким:
1
| |
А параметр listen вот так:
1 2 3 4 | |
После изменения настроек перезапустите nginx.
Тестирование
Создайте файл test.php в корневом каталоге nginx следующего содержания:
1
| |
В браузере сделайте запрос:
1 2 3 4 5 | |
Обратите внимание на значение REQUEST_URI, SCRIPT_NAME, PATH_INFO и PHP_SELF.
Вот правильный вывод для
1
| |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
Необходимые условия:
- Требования к PHP - версия 5.3.3 или выше.
- В php.ini значение cgi.fix_pathinfo = 1 (в некоторых мануалах советуют cgi.fix_pathinfo = 0 что может привести к не правильной обработке переменной PHP_SELF не равной DOCUMENT_URI).
- Регулярное выражение fastcgi_split_path_info должно корректно обрабатывать запросы, такие как /test.php/foo/blah.php или /test.php/.
- Необходимо разрешить nginx'у проверку *.php файлов чтобы предотвратить возможность передачи любых других файлов через PHP-FPM (например загруженные картинки).
Ознакомиться с более подробной информацией о FastCGI вы можете на официальном сайте.