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 вы можете на официальном сайте.