Конфигурация Nginx с PHP-FPM

Nginx является самым популярным из используемых сейчас веб-серверов. Он отличается широтой функционала (может использоваться как независимый сервер, прокси, балансер) и высокой скоростью работы.


Простейшая конфигурация, достаточная для отдачи статических сайтов
— можно применять для заглушек и 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;
}
}

 

 

Nginx PHP-FPM настройка связки и отдача скриптов через Nginx

Поскольку Nginx может отдавать только статику для работы ему нужен менеджер процессов — чаще всего это PHP-FPM, хотя сервер может направлять запросы в Apache, UWSGI и т.п. Можно считать, что он работает самостоятельно только в случае с PHP-FPM.

В конфигурационном файле это выглядит так:

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 для отдачи динамического содержимого

upstream backend {

server example.com;

}

server {

listen 80 default server;
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 позволяющий балансировать нагрузку на несколько бэкендов. Это позволяет сохранить приложение в работоспособном состоянии в случае отказа одного из серверов, выполняющих скрипты и отвечающих на запросы пользователя.