В этой статье разберём на примере 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
Если статус не 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.