MAATRIX / Блог / PHP-FPM + nginx на VPS

PHP-FPM + nginx на VPS

Блог MAATRIX · 2026-07-07

nginx сам по себе PHP не выполняет — он передаёт запросы обработчику FPM. Соберём связку правильно: поставим нужную версию PHP, настроим пул воркеров и nginx, проверим через тестовый скрипт.

Как работает связка nginx + PHP-FPM

['nginx отдаёт статику сам, а запросы к .php передаёт по протоколу FastCGI процессу php-fpm. FPM держит пул готовых воркеров, поэтому запросы обрабатываются без затрат на запуск интерпретатора каждый раз.', 'Связь между ними идёт через Unix-сокет (быстрее, локально) или TCP-порт (гибче, для распределённых схем). Для одного сервера выбирайте сокет.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для PHP-сайта

Установка PHP-FPM

['На Ubuntu свежие версии PHP берут из PPA ondrej, на Debian — из репозитория Sury. Пример для Ubuntu, PHP 8.3:', '
add-apt-repository -y ppa:ondrej/php\napt update\napt install -y php8.3-fpm php8.3-cli php8.3-mysql php8.3-curl php8.3-mbstring php8.3-xml php8.3-zip
', 'Проверяем, что сервис запущен:', '
systemctl status php8.3-fpm\nphp -v
']

Настройка пула воркеров

['Конфиг пула — /etc/php/8.3/fpm/pool.d/www.conf. Ключевые параметры: пользователь, сокет и стратегия управления процессами:', '
user = www-data\ngroup = www-data\nlisten = /run/php/php8.3-fpm.sock\nlisten.owner = www-data\nlisten.group = www-data\n\npm = dynamic\npm.max_children = 20\npm.start_servers = 4\npm.min_spare_servers = 2\npm.max_spare_servers = 6
', 'pm.max_children ограничивает одновременные PHP-запросы. Ориентир: доступная память / средний размер воркера (обычно 30-60 МБ). Слишком большое значение приведёт к свопу.']

Конфиг nginx

['В server-блоке добавьте обработку PHP через сокет FPM:', '
server {\n    listen 80;\n    server_name example.com;\n    root /var/www/example.com;\n    index index.php index.html;\n\n    location / {\n        try_files $uri $uri/ /index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        include snippets/fastcgi-php.conf;\n        fastcgi_pass unix:/run/php/php8.3-fpm.sock;\n    }\n\n    location ~ /\\.ht {\n        deny all;\n    }\n}
', 'Путь сокета в fastcgi_pass должен точно совпадать с listen из пула. Несовпадение — самая частая причина ошибки 502.']

Применение и проверка

['Перезапустите оба сервиса и проверьте синтаксис nginx:', '
nginx -t\nsystemctl reload nginx\nsystemctl restart php8.3-fpm
', 'Создайте тестовый файл и откройте его в браузере (после проверки удалите — он раскрывает конфигурацию):', '
echo "<?php phpinfo();" > /var/www/example.com/info.php
', 'Если видите 502 Bad Gateway — проверьте, что FPM жив и сокет на месте:', '
systemctl status php8.3-fpm\nls -l /run/php/\ntail -f /var/log/nginx/error.log
', 'На NVMe-дисках MAATRIX PHP-приложения (WordPress, Laravel) отдают страницы заметно быстрее — узким местом чаще становится не диск, а сам код.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для PHP-сайта

Частые вопросы

Сокет или TCP — что выбрать?

На одном сервере — Unix-сокет: меньше накладных расходов и он недоступен извне. TCP нужен, когда nginx и PHP на разных машинах.

Как поднять несколько версий PHP?

Установите php7.4-fpm и php8.3-fpm параллельно — у каждого свой сокет. В нужном server-блоке nginx укажите соответствующий fastcgi_pass.

Откуда постоянные ошибки 502?

Чаще всего: неверный путь сокета в fastcgi_pass, упавший FPM или превышенный pm.max_children. Смотрите error.log nginx и лог FPM.