PHP-FPM + nginx на VPS
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.