В 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
Обратившись в браузере к URL, который выбран для тестирования, можно увидеть, что PHP скрипт выполняется.
Это говорит об успешном перенаправлении запросов на /run/php/php7.0-fpm.sock и о том, что конфигурация с Nginx unix socket работает.
Если обращений к серверу много, улучшить производительность позволит тонкая настройка Nginx.