Настройка nginx и php-fpm подходит для серверов с сайтами на PHP, для которых не требуется обработка файлов .htaccess . Конфигурация отличается самой высокой скоростью работы по сравнению с аналогами (с apache как модулем php, только apache).
Простейшая конфигурация, достаточная для отдачи статических сайтов — можно применять для заглушек и Landing Page:
server {
listen 80;
root /var/www/example.com:
index index.php index.html;
server_name example.com;
location / {
try_files $uri $uri/ =404;
}
}
Здесь нет блока для PHP. Для работы с PHP нужно дополнить конфигурацию.
Поскольку Nginx может отдавать только статику для работы ему нужен менеджер процессов — в данном случае это PHP-FPM, также сервер может направлять запросы в Apache, UWSGI и т.п.
В конфигурационном файле блок выглядит так:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
В качестве fastcgi_pass здесь указывается сетевой сокет 127.0.0.1:9000, также возможно указание Unix сокета — fastcgi_pass unix:/var/run/php5-fpm.sock; в случае использования fpm. Использования Unix сокета предпочтительной из соображений безопасности. Также с сокетом скорость работы будет выше.
Последние 2 директивы отвечают за передачу имени скрипта и метода запроса, их использование необходимо для корректной коммуникации fastcgi с бэкендом.
$document_root — обеспечит приведение к корневой директории
$fastcgi_script_name — заменится при запросе на путь к конкретному скрипту
Комбинация директив обеспечит правильный вызов скрипта при обращении по URI
fastcgi_param в Nginx
fastcgi_param можно указывать для всех директив конфигурационного файла
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
location /scripts {
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
}
В этом случае значения унаследуются всеми нижестоящими location-ами. Стоит помнить про один момент — если fastcgi_param переопределить в одном из location — ни одна из одноименных вышестоящих директив учитываться не будет (для location в котором определяется fastcgi_param).
Избежать этого можно используя include, подключая с его помощью заранее созданные конфигурационные файлы, текущие правила при этом не перезаписываются.
В файле fastcgi_common перечисляются директивы fastcgi_param, затем в основном конфигурационном файле вызывается в нужной секции.
location ~ \.php$ {
include fastcgi_common;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
}
В такой файл следует помещать все директивы. которые мы хотели бы кастомизировать — значения которых меняют определенные уровнем выше
Настройка Nginx с PHP-FPM: конфигурационный файл Nginx для отдачи динамического содержимого
upstream backend { server example.com; } server { listen 80; root /var/www/example.com; index index.php; server_name example.com; location / { try_files $uri $uri/ =404; } location ~.php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; try_files $uri =404; #cgi.fix_pathinfo=0 in php.ini fastcgi_pass backend; fastcgi_index index.php; include fastcgi_params; } }
В файл добавлен блок upstream backend позволяющий балансировать нагрузку на несколько бэкендов.
Бэкенд один, но можно добавить дополнительные что сделаем конфигурацию отказоустойчивой и позволяет сохранить приложение в работоспособном состоянии в случае отказа одного из серверов, выполняющих скрипты и отвечающих на запросы пользователя.
Конфигурация подключается в /etc/nginx/nginx.conf за счет include /etc/nginx/example.com;
Если убрать секцию с upstream, то получится готовый файл вирутального хоста, который можно без отдельного подключения добавить в /etc/nginx/conf.d/ дав файлу расширение .conf
На скриншоте приведен добавленный в /etc/nginx/nginx.conf блок с настройками и прошедший тест конфигуарции. Настройка Nginx с PHP-FPM на этом завершена.
Сам php-fpm можно установить на сервер с помощью пакетного менеджера, в Debian/Ubuntu так:
apt install php-fpm
Сервис в зависимости от версии запустится либо на порту 9000, либо на Unix сокете. Путь к порту или сокету задается в Nginx за счет чего обеспечивается проксирование.