Как установить и настроить PHP-FPM для работы с Nginx и Apache на VPS?

В этой статье разберём на примере Ubuntu/Debian:

  • как установить PHP-FPM и основные расширения;
  • как проверить, что PHP-FPM запустился и на каком сокете/порту он слушает;
  • как настроить связку Nginx + PHP-FPM;
  • как подключить PHP-FPM к Apache вместо mod_php;
  • какие ошибки возникают чаще всего и как их исправить.

Установка PHP-FPM и базовых расширений

Начнём с установки PHP-FPM и нескольких популярных модулей, которые чаще всего нужны для сайтов (PDO, MySQL, mbstring, XML, cURL, zip и т.д.). На Ubuntu ставим так:

sudo apt update
sudo apt install -y php-fpm php-cli php-mbstring php-xml php-curl php-zip php-mysql

Пакет php-fpm подтянет актуальную версию PHP для дистрибутива (например, php8.2-fpm).

Проверяем версию PHP в консоли:

php -v

Проверяем, что служба PHP-FPM запущена. В разных версиях PHP название сервиса отличается, поэтому лучше посмотреть так:

systemctl list-units 'php*-fpm.service'

Или явно, если знаем версию:

sudo systemctl status php8.2-fpm
Проверка статуса службы PHP-FPM на VPS

Если статус не active (running): смотрим лог службы:

sudo journalctl -u php8.2-fpm -xe

Где PHP-FPM слушает: сокет или порт

Nginx и Apache должны «достучаться» до PHP-FPM. Для этого он слушает либо Unix-сокет (файл в /run/php/), либо TCP-порт (например, 127.0.0.1:9000). Уточним, что именно используется на сервере.

Открываем конфигурацию пула (по умолчанию пул www):

sudo nano /etc/php/8.2/fpm/pool.d/www.conf

Подставь свою версию PHP вместо 8.2 — можно посмотреть через ls /etc/php.

Ищем строку listen = .... Примеры:

listen = /run/php/php8.2-fpm.sock
# или
listen = 127.0.0.1:9000

Это значение нам понадобится в конфиге Nginx/Apache. Если путь или порт неправильно прописать в сервере, будет 502/503.

Совет: после правок в www.conf не забывай перезапускать PHP-FPM:

sudo systemctl restart php8.2-fpm

Настройка Nginx + PHP-FPM

Предположим, сайт лежит в /var/www/example.com, а Nginx уже установлен. Нужно создать (или отредактировать) серверный блок и добавить туда обработку PHP.

Открываем конфиг сайта (пример):

sudo nano /etc/nginx/sites-available/example.com

Пример минимальной конфигурации Nginx с PHP-FPM по сокету:

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        # если PHP-FPM слушает по порту, используем:
        # fastcgi_pass 127.0.0.1:9000;
    }

    location ~* \.(jpg|jpeg|png|gif|css|js|ico|svg)$ {
        try_files $uri $uri/ =404;
        access_log off;
        expires max;
    }
}

Важное место — строка fastcgi_pass. Она должна совпадать с параметром listen в www.conf.

Включаем сайт и перезагружаем Nginx:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Создаём простой phpinfo() для проверки:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/example.com/info.php

Открываем в браузере http://example.com/info.php и проверяем, что страница отрабатывает.

Права на каталог: часто 403/502 связаны с правами. Обычно достаточно:

sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www

Настройка Apache + PHP-FPM

С Apache два варианта: старый mod_php и современный PHP-FPM через proxy_fcgi. На VPS лучше использовать PHP-FPM + mpm_event.

1. Включаем нужные модули и выключаем mod_php (если есть)

sudo a2dismod php7.4 php8.0 php8.1 php8.2 2>/dev/null || true
sudo a2dismod mpm_prefork 2>/dev/null || true
sudo a2enmod mpm_event proxy_fcgi setenvif

После этого перезапустим Apache:

sudo systemctl restart apache2

2. Настраиваем виртуальный хост с PHP-FPM

Открываем конфиг сайта:

sudo nano /etc/apache2/sites-available/example.com.conf

Пример конфигурации Apache с PHP-FPM по сокету:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/example.com

    <Directory /var/www/example.com>
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
        # если PHP-FPM слушает по порту:
        # SetHandler "proxy:fcgi://127.0.0.1:9000"
    </FilesMatch>

    ErrorLog ${APACHE_LOG_DIR}/example-error.log
    CustomLog ${APACHE_LOG_DIR}/example-access.log combined
</VirtualHost>

Активируем сайт и перегружаем Apache:

sudo a2ensite example.com.conf
sudo apachectl configtest
sudo systemctl reload apache2

Так же, как и в случае с Nginx, создаём файл info.php в корне сайта и проверяем его в браузере.

Частые ошибки и как их исправить

  • Nginx: 502 Bad Gateway

    Чаще всего:

    • PHP-FPM не запущен: sudo systemctl status php8.2-fpm;

    • несовпадение fastcgi_pass с параметром listen в www.conf;

    • права на сокет (listen.owner, listen.group в www.conf), если Nginx не может к нему обратиться.

  • Apache: 503 Service Unavailable / 500

    • неверный путь к сокету в SetHandler;

    • PHP-FPM не запущен или перезапускается с ошибкой;

    • конфликт модулей: включён и mod_php, и PHP-FPM (надо отключить php*-модули).

    Смотрим лог ошибок Apache:

    sudo tail -f /var/log/apache2/error.log
  • info.php скачивается вместо выполнения

    Это значит, что правило обработки PHP не сработало:

    • для Nginx — проверь блок location ~ \.php$ { ... };

    • для Apache — проверь FilesMatch "\.php$" и SetHandler.

  • Белый экран (без ошибок)

    Обычно это внутренние ошибки PHP. Временно включаем вывод ошибок (на тестовом сервере!):

    sudo nano /etc/php/8.2/fpm/php.ini

    Меняем:

    display_errors = On
    error_reporting = E_ALL

    Перезапускаем PHP-FPM, смотрим, что пишет скрипт и логи PHP.

Итоги

  • Установили PHP-FPM и базовые модули PHP на VPS.

  • Разобрались, где PHP-FPM слушает — через Unix-сокет или TCP-порт.

  • Подключили PHP-FPM к Nginx и Apache, настроили обработку .php-файлов.

  • Разобрали типичные ошибки (502, 503, скачивание PHP вместо выполнения, белый экран) и пути их решения.

Вывод: связка PHP-FPM + Nginx/Apache даёт гибкость и стабильность на VPS. Главное — не путать путь к сокету/порту, следить за правами и не держать модуль mod_php включённым параллельно с PHP-FPM.

Оставить комментарий