Skip to content

This article is available in Russian. An English version is on the way.Open the Russian page

PHP-FPM с Nginx

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

Level
Intermediate
Reading time
2 min read
Updated
Tested on
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Contents
  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» — воркеров не хватает. Увеличьте лимит, если позволяет память, или ищите медленные запросы.

Read to the end and the article counts toward your learning progress.

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

Was this article helpful?