Nginx unix socket


В Nginx unix socket — способ подключения к бэкенду в виде PHP-FPM, позволяющий избежать сетевых запросов и дающий значительный прирост в скорости работы.

Nginx является самым быстрым веб-сервером, но он не может обрабатывать скрипты. Для этого нужен бэкенд. В случае с PHP скриптами роль бэкенда выполняет Apache или PHP-FPM.

С приложениями на Python, Ruby, NodeJS могут использоваться другие серверы приложений.

Рассмотрим случай с PHP-FPM и подключение Nginx к сервису способом, который дает максимальную скорость работы — через unix socket.



Nginx unix socket, ускорение Nginx в связки с PHP-FPM


Использование Unix сокета вместо TCP сокета позволяет работать быстрее за счет отсутствия сетевых запросов (обращений к 127.0.0.1).

Рассмотрим установку на Debian 9, для более свежих версий всё будет работать точно также, изменится только версия PHP. Для дистрибутива FPM сразу запускается на unix socket-е.


Устанавливаем пакеты на новый сервер

apt-get install php-fpm

apt-get install nginx



Настройка Nginx


Создаем файл виртуального хоста

cd /etc/nginx/sites-available && mcedit fpm

server {
listen 80;
server_name fpm.com;

root /var/www/fpm.com;
index index.php index.html;

location / {
try_files $uri $uri/ =404;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# fastcgi_pass 127.0.0.1:9000;
}

}

В последней секции задано, что при обработке всех файлов с расширением .php запросу нужно направлять на unix сокет unix:/var/run/php/php7.0-fpm.sock.

В случае с TCP эта строк комментируется, с fastcgi_pass 127.0.0.1:9000; знак комментария снимается.

Переключение способа подключения Nginx к PHP-FPM выполняется одной строкой с директивой fastcgi_pass.




Имя fpm.com нужно добавить в файл hosts на сервере если используется это же тестовое имя и нужен такой же резуальтат как в статье.

Строка для добавления в /etc/hosts:

127.0.0.1 fpm.com

С доменом направленным на сервер этого не требуется.




Далее тестовый скрипт

mcedit /var/www/fpm.com/index.php

echo "works";

До и после строки добавляем открывающий и закрывающий тэги PHP соответственно

О php тэгах в документации php



Активируем виртуальный хост

ln -s /etc/nginx/sites-available/fpm /etc/nginx/sites-enabled/

Перечитываем конфигурацию

nginx -s reload



Настройка FPM


PHP-FPM запущен, но в netstat -nltp его не увидеть, потому, что TCP-сокет не используется

ss -l | grep fpm

u_str LISTEN 0 128 /run/php/php7.0-fpm.sock 17149 * 0

В файле /etc/php/7.0/fpm/pool.d/www.conf директивой listen для FPM задается как запускать службу. Unix сокет или комбинация порта и IP адреса.



Значение всегда можно поменять, что и требуется сделать когда нужен переход с TCP на Unix-сокет. Дополнительно к внесению изменений в Nginx.



mcedit /etc/php/7.0/fpm/pool.d/www.conf

listen = /run/php/php7.0-fpm.sock
listen.owner = www-data
listen.group = www-data



nginx unix socket


Обратившись в браузере к URL, который выбран для тестирования, можно увидеть, что PHP скрипт выполняется.



Это говорит об успешном перенаправлении запросов на /run/php/php7.0-fpm.sock и о том, что конфигурация с Nginx unix socket работает.


Если обращений к серверу много, улучшить производительность позволит тонкая настройка Nginx.

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