Перейти к содержимому

PHP-FPM с Nginx

Подключить PHP к Nginx через FastCGI: какая версия в вашей системе, сокет, лимиты и пул процессов.

Уровень
Средний
Время чтения
2 мин чтения
Обновлено
Проверено на
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Содержание
  1. Установка
  2. Настройка Nginx
  3. Лимиты php.ini
  4. Пул процессов
  5. Частые ошибки

Nginx не выполняет PHP сам — он передаёт запросы процессу PHP-FPM через Unix-сокет. В стандартных репозиториях версия PHP своя для каждой системы:

СистемаВерсия PHPСокет
Ubuntu 24.048.3/run/php/php8.3-fpm.sock
Ubuntu 22.048.1/run/php/php8.1-fpm.sock
Debian 128.2/run/php/php8.2-fpm.sock

Установка

bash
$ apt update$ apt install -y php-fpm php-cli php-mysql php-curl php-mbstring php-xml php-zip php-gd php-intl

Узнайте установленную версию и сохраните её в переменную — дальше команды используют её:

bash
$ PHP=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')$ echo $PHP$ systemctl enable --now php$PHP-fpm$ ls /run/php/

Настройка Nginx

Фрагмент server { … } — подставьте свою версию в путь к сокету
root /var/www/example.com;index index.php index.html;location / {    try_files $uri $uri/ /index.php?$args;}location ~ \.php$ {    include snippets/fastcgi-php.conf;    fastcgi_pass unix:/run/php/php8.3-fpm.sock;}location ~ /\.(ht|git) {    deny all;}
bash
$ echo '<?php phpinfo();' > /var/www/example.com/info.php$ nginx -t && systemctl reload nginx$ curl -s http://example.com/info.php | grep -m1 'PHP Version'$ rm /var/www/example.com/info.php

Лимиты php.ini

Настройки для FPM лежат в /etc/php/ВЕРСИЯ/fpm/php.ini. Чаще всего меняют размер загрузок и лимит памяти:

/etc/php/8.3/fpm/php.ini
upload_max_filesize = 32Mpost_max_size = 32Mmemory_limit = 256Mmax_execution_time = 60

Если увеличили upload_max_filesize, поднимите и client_max_body_size в Nginx — иначе запрос отрежет раньше, чем он дойдёт до PHP.

Пул процессов

Количество воркеров задаётся в /etc/php/ВЕРСИЯ/fpm/pool.d/www.conf. Ориентир для pm.max_children — свободная память, делённая на средний размер процесса PHP (столбец RSS в выводе ps -o rss,cmd -C php-fpm8.3).

pool.d/www.conf
pm = dynamicpm.max_children = 10pm.start_servers = 3pm.min_spare_servers = 2pm.max_spare_servers = 5
bash
$ php-fpm$PHP -t && systemctl reload php$PHP-fpm

Частые ошибки

  • 502 Bad Gateway — путь к сокету в Nginx не совпадает с реальной версией PHP (ls /run/php/).
  • Браузер скачивает .php вместо выполнения — нет блока для .php или сайт открывается другим server block.
  • В журнале «server reached pm.max_children» — воркеров не хватает. Увеличьте лимит, если позволяет память, или ищите медленные запросы.

Дочитайте до конца — статья засчитается в обучении автоматически.

  • PHP
  • PHP-FPM
  • Nginx
  • FastCGI
  • LEMP

Статья помогла?