Настройка Nginx с PHP-FPM


Настройка 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


Настройка Nginx с PHP-FPM


На скриншоте приведен добавленный в /etc/nginx/nginx.conf блок с настройками и прошедший тест конфигуарции. Настройка Nginx с PHP-FPM на этом завершена.


Сам php-fpm можно установить на сервер с помощью пакетного менеджера, в Debian/Ubuntu так:


apt install php-fpm


Сервис в зависимости от версии запустится либо на порту 9000, либо на Unix сокете. Путь к порту или сокету задается в Nginx за счет чего обеспечивается проксирование.

Сказать спасибо