Как подключить NGINX к PHP-FPM с помощью UNIX или сокета TCP/IP
Веб-сервер NGINX (в качестве обратного прокси-сервера) обслуживает приложения PHP через протокол FastCGI (в качестве внутреннего сервера приложений). NGINX использует PHP-FPM (FastCGI Process Manager), альтернативную реализацию PHP FastCGI, которая работает в фоновом режиме как демон и прослушивает CGI запросы. Он поставляется с дополнительными функциями, предназначенными для поддержки тяжелонагруженных веб-сайтов или веб-приложений, но его можно использовать для сайтов любого размера.
PHP-FPM не только поддерживает настройку пулов ресурсов FastCGI, но также улучшает многие внутренние функции FastCGI и увеличивает количество отчетов об ошибках, скриптах. расторжение договора и многое другое. Он имеет демонизацию PHP, управление процессами, динамическое количество процессов, от которых могут поступать запросы, заголовок ошибки, поддержку ускоренной загрузки и многое другое.
Чтобы принимать запросы FastCGI от NGINX, PHP-FPM может прослушивать либо сокет TCP/IP, либо домен UNIX. разъем. Какой бы адрес вы ни выбрали, он будет использоваться NGINX для подключения (запросов прокси) к PHP-FPM с помощью директивы fastcgi_pass
.
В этом руководстве объясняется, как настроить NGINX для серверных приложений PHP с помощью PHP-FPM. В нем описывается, когда использовать сокет TCP/IP или сокет домена UNIX для подключения NGINX к PHP-FPM и почему.
В этом руководстве предполагается, что в вашей системе Linux установлены NGINX и PHP-FPM; в противном случае см.:
- Как установить сервер LEMP на CentOS 8
- Как установить стек LEMP PhpMyAdmin на сервер Ubuntu 20.04
- Как установить NGINX, MySQL/MariaDB и PHP на RHEL 8
- Как установить LEMP на сервер Debian 10
Что мне следует использовать: сокет домена UNIX или сокет TCP/IP?
Сокеты домена UNIX (или IPC) — это средство межпроцессного взаимодействия (IPC), которое обеспечивает эффективный обмен данными между процессами, работающими в одной и той же операционной системе, в то время как TCP Сокеты /IP (или Интернет-домен) позволяют процессам обмениваться данными по сети.
В отличие от сокета TCP/IP, который идентифицирует сервер по IP-адресу и порту (например, 127.0.0.1:9000), вы можете привязать сервер к сокету домена UNIX, используя путь к файлу (например, /run/php-fpm/www.sock), который отображается в файловой системе.
Сокет домена UNIX — это особый тип файла: к нему применяются разрешения для файлов и каталогов (как и в случае с любым другим типом файла UNIX) и могут использоваться для ограничения того, какие процессы на хосте могут читать и записывать в файл. (и, таким образом, связываться с внутренним сервером).
Таким образом, сокет домена UNIX безопасен, поскольку его могут использовать только процессы на локальном хосте. Сокет TCP/IP может быть открыт для доступа в Интернет, что представляет угрозу безопасности, если не будут приняты дополнительные меры безопасности, такие как брандмауэр.
Важно отметить, что использование сокета домена UNIX — это не то же самое, что использование сокета TCP/IP с точки зрения производительности: несколько тестов и тестов доказали, что сокеты домена UNIX работают быстрее. Основным недостатком доменных сокетов UNIX является то, что они менее масштабируемы и поддерживают межпроцессное взаимодействие только в пределах одной операционной системы (ОС).
Где я могу настроить адрес прослушивания PHP-FPM?
Вы можете настроить адрес, который будет прослушиваться PHP-FPM, в файле конфигурации пула ресурсов. Обратите внимание, что с помощью PHP-FPM вы можете запускать несколько пулов процессов с разными настройками. Пул по умолчанию называется www
.
Расположение файла конфигурации пула ресурсов зависит от способа установки PHP и PHP-FPM в системе Linux (будь то версия по умолчанию/одна версия или несколько версий одновременно). .
Например, в CentOS 8, в одной версии, все файлы конфигурации PHP расположены в каталоге /etc
и по умолчанию PHP-FPM. Файл конфигурации пула (www)
: /etc/php-fpm.d/www.conf:
Чтобы просмотреть все файлы конфигурации PHP, используйте следующую команду ls.
ls /etc/php*
В Ubuntu 20.04 файлы конфигурации PHP расположены в каталоге /etc/php/
и в каталоге PHP-FPM по умолчанию. > файл конфигурации пула (www)
: /etc/php/
:
ls /etc/php/7.4/
Настройка PHP-FPM для прослушивания сокета домена UNIX
Чтобы настроить PHP-FPM для прослушивания сокета домена UNIX, откройте файл конфигурации пула PHP-FPM по умолчанию, используя ваш любимый текстовый редактор.
sudo vim /etc/php/7.4/fpm/pool.d/www.conf #Ubuntu/Debian
OR
vim /etc/php-fpm.d/www.conf #CentOS/RHEL/Fedora
Затем найдите директиву Listen и установите для нее путь к файлу сокета домена UNIX следующим образом. Обратите внимание, что в большинстве установок по умолчанию используется сокет домена UNIX.
listen = /run/php/php7.4-fpm.sock #Ubuntu/Debian
OR
listen = /run/php-fpm/www.sock #CentOS/RHEL/Fedora
Если вы используете сокет домена UNIX, вам также необходимо установить соответствующие разрешения на чтение/запись для файла, чтобы разрешить подключения с веб-сервера NGINX. По умолчанию NGINX запускается как пользователь и группа nginx в CentOS/RHEL/Fedora и www-data в Ubuntu. и Debian.
Итак, найдите параметры listen.owner
и listen.group
и установите их соответствующим образом. Также установите режим 0660 с помощью параметра listen.mode
.
------------- On Debian and Ubuntu -------------
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
------------- On CentOS/RHEL and Fedora -------------
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Обратите внимание: если разрешения для файла сокета домена UNIX установлены неправильно, NGINX может вернуть ошибку неверного шлюза.
Настройка PHP-FPM для прослушивания сокета TCP/IP
Хотя сокет домена UNIX работает быстрее, чем сокет TCP/IP, первый менее масштабируем, поскольку может поддерживать межпроцессное взаимодействие только в одной и той же ОС. Если NGINX и внутренний сервер приложений (PHP-FPM) работают в разных системах, вам придется настроить PHP-FPM для прослушивания сокет TCP/IP для соединений.
В файле конфигурации пула PHP-FPM установите адрес listen
следующим образом. Убедитесь, что выбранный вами порт не используется другим процессом или службой в той же системе.
listen = 127.0.0.1:3000
Настройка NGINX для работы с сервером приложений PHP-FPM
После того как вы настроили адрес, который прослушивает PHP-FPM, вам необходимо настроить NGINX для прокси-запроса к нему через этот адрес, используя fastcgi_pass
параметр конфигурации в файле конфигурации блока виртуального сервера.
Например, если файл конфигурации вашего веб-сайта — /etc/nginx/conf.d/example.com.conf, откройте его для редактирования.
vim /etc/nginx/conf.d/example.com.conf
Найдите блок location
для обработки файлов .php
и установите параметр fastcgi_pass
следующим образом, если вы настроили PHP-FPM для прослушивания в UNIX. доменный сокет.
fastcgi_pass unix:/run/php/php7.4-fpm.sock #Ubuntu/Debian
OR
fastcgi_pass unix:/run/php-fpm/www.sock #CentOS/RHEL/Fedora
Или используйте адрес TCP/IP, если вы настроили PHP-FPM для прослушивания сокета TCP/IP. Если внутренний сервер приложений (PHP-FPM) работает на отдельном сервере (замените 10.42.0.10 IP-адресом компьютера, на котором установлен сервер PHP-FPM FastCGI). бежит).
fastcgi_pass 10.42.0.10:3000;
Важно: в CentOS 8 PHP-FPM определяется как вышестоящий сервер в / etc/nginx/conf.d/php-fpm.conf в восходящем блоке с именем php-fpm.
Здесь вы можете внести соответствующие изменения в зависимости от адреса, который PHP-FPM настроен для прослушивания, в файле конфигурации пула. Конфигурация по умолчанию указывает на сокет домена UNIX.
upstream php-fpm {
server unix:/run/php-fpm/www.sock;
}
и в файле блокировки сервера вашего сайта просто установите параметр fastcgi_pass
, как показано.
fastcgi_pass php-fpm;
После внесения изменений в конфигурации PHP-FPM и NGINX проверьте правильность синтаксиса их конфигурации следующим образом.
------------- On Debian and Ubuntu -------------
sudo php-fpm -t
sudo nginx -t
------------- On CentOS/RHEL and Fedora -------------
php-fpm -t
nginx -t
Хотя в выводе команды отображается только основной файл конфигурации, все остальные файлы конфигурации также включаются и проверяются.
Затем вам необходимо перезапустить две службы, чтобы применить изменения, используя команду systemctl.
------------- On Debian and Ubuntu -------------
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm
------------- On CentOS/RHEL and Fedora -------------
systemctl restart nginx
systemctl restart php-fpm
Если вы обнаружите какие-либо ошибки, вы можете проверить файлы журналов NGINX и PHP-FPM с помощью команды cat.
------------- On Debian and Ubuntu -------------
cat /var/log/nginx/error.log
cat /var/log/php7.4-fpm.log
------------- On CentOS/RHEL and Fedora -------------
cat /var/log/nginx/error.log
cat /var/log/php-fpm/www-error.log
Это все, что у нас было для вас. Раздел комментариев ниже можно использовать, чтобы задавать вопросы. Дополнительную информацию см. в документации NGINX и документации PHP-FPM.