Поиск по сайту:

Как подключить 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//fpm/pool.d/www.conf:

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.