Короткий ответ: PHP для веб-сервера ставится не как модуль Apache, а как отдельная служба php-fpm, которая принимает запросы от nginx через сокет. Такой вариант быстрее и позволяет держать разные версии PHP для разных сайтов одновременно. Ключевые шаги: подключить репозиторий с нужной версией, установить php-fpm с набором расширений, настроить nginx на передачу .php в сокет и проверить через страницу с phpinfo().
Этот материал продолжает цикл про настройку Ubuntu 24.04 на VPS. Перед ним стоит разобраться с установкой nginx.
Установка
В штатном репозитории Ubuntu версия PHP зависит от выпуска. Если нужна конкретная версия, подключают репозиторий ondrej/php:
apt update
apt install -y software-properties-common
add-apt-repository -y ppa:ondrej/php
apt update
apt install -y php8.4-fpm php8.4-cli php8.4-mysql php8.4-pgsql
php8.4-curl php8.4-mbstring php8.4-xml php8.4-zip php8.4-gd
php8.4-intl php8.4-bcmath php8.4-redis
systemctl enable --now php8.4-fpm
php -v
Расширения ставятся отдельными пакетами — это нормально и удобно: на сервере оказывается только то, что нужно приложению.
Что за что отвечает
| Пакет | Назначение |
|---|---|
php8.4-fpm |
Служба обработки PHP-запросов от веб-сервера |
php8.4-cli |
Запуск PHP из командной строки: скрипты, composer, cron |
php8.4-mysql |
Драйвер MySQL и MariaDB |
php8.4-pgsql |
Драйвер PostgreSQL |
php8.4-mbstring |
Корректная работа с многобайтовыми строками, включая кириллицу |
php8.4-xml |
Работа с XML и большинством современных библиотек |
php8.4-gd |
Обработка изображений |
php8.4-intl |
Локализация, форматирование дат и чисел |
php8.4-bcmath |
Точная арифметика с дробными числами |
php8.4-redis |
Подключение к Redis |
Пакеты -cli и -fpm — разные сборки с разными конфигурациями. Частая ошибка: расширение установлено, но не подключено для FPM, потому что конфигурации лежат в разных каталогах.
Где лежат настройки
| Путь | Назначение |
|---|---|
/etc/php/8.4/fpm/php.ini |
Основные настройки для веб-запросов |
/etc/php/8.4/cli/php.ini |
Настройки для командной строки |
/etc/php/8.4/fpm/pool.d/www.conf |
Пул процессов: сокет, пользователь, лимиты |
/etc/php/8.4/fpm/conf.d/ |
Подключённые расширения |
/var/log/php8.4-fpm.log |
Журнал службы |
Связка с nginx
Пул FPM слушает сокет. Путь указан в pool.d/www.conf:
listen = /run/php/php8.4-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
В конфигурации сайта nginx запросы к .php передаются в этот сокет:
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
}
location ~ /.ht {
deny all;
}
После правок — проверка и перезагрузка обоих:
nginx -t && systemctl reload nginx
systemctl reload php8.4-fpm
Если nginx отдаёт 502 Bad Gateway, причина почти всегда в одном из трёх: сокет не существует, у nginx нет прав на него, или путь в конфигурации указан неверно. Проверить: ls -l /run/php/ и tail -20 /var/log/php8.4-fpm.log.
Проверка
Создайте файл /var/www/example.com/info.php:
<?php phpinfo();
Откройте его в браузере: страница покажет версию PHP, подключённые расширения и значения лимитов. Удалите файл сразу после проверки — phpinfo() раскрывает конфигурацию сервера.
Настройки для рабочего сервера
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 60
display_errors = Off
log_errors = On
error_log = /var/log/php-errors.log
date.timezone = Europe/Moscow
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
| Настройка | Почему важна |
|---|---|
display_errors = Off |
На рабочем сервере ошибки не должны попадать в ответ пользователю |
post_max_size |
Должен быть не меньше upload_max_filesize, иначе загрузка крупных файлов не сработает |
opcache.enable |
Кэширует скомпилированный код — самый заметный прирост скорости |
date.timezone |
Без явного значения часть функций выдаёт предупреждения |
После правки php.ini службу нужно перезагрузить: systemctl reload php8.4-fpm. Изменения применяются только при перезапуске, в отличие от файлов проекта.
Несколько версий PHP на одном сервере
Преимущество FPM в том, что версии не конфликтуют. Ставятся параллельно:
apt install -y php8.3-fpm php8.2-fpm
Каждая создаёт свой сокет /run/php/php8.3-fpm.sock и /run/php/php8.2-fpm.sock. В конфигурации конкретного сайта указывается нужный сокет — и два проекта на разных версиях PHP работают на одном сервере одновременно.
Типичные ошибки
- Расширение не подключено для FPM. Установлено для CLI, но не для веб-запросов. Лечится
phpenmodили установкой пакета с нужной привязкой. - Неверный путь к сокету. Ответ
502. Проверяется командойls -l /run/php/. - Права на сокет. nginx не может подключиться, если владелец сокета не
www-data. display_errorsвключён на проде. Раскрывает пути и версии, помогает атакующему.- Забыли удалить
info.php. Открытая страница с конфигурацией сервера. - Не перезагрузили FPM после правки
php.ini. Изменения не применились.
