Настройка PHP 7.4 FPM: практическое руководство для администраторов

Раздел: Администрирование сервера -> Установка PHP-FPM

Установка и настройка PHP 7.4 FPM

Как наиболее эффективно установить и настроить PHP 7.4 FPM на сервере под управлением Ubuntu 20.04?

Рекомендуется использовать официальный PPA-репозиторий ondrej/php, который содержит актуальные версии PHP для Ubuntu. Этот метод обеспечивает простоту обновления и совместимость с системными пакетами.

sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php7.4-fpm php7.4-cli php7.4-common php7.4-mysql php7.4-curl php7.4-gd php7.4-xml php7.4-mbstring

Php 7.4 fpm (установка и настройка php 7.4 fpm)

После установки необходимо настроить пул FPM. Основной конфигурационный файл пула находится в /etc/php/7.4/fpm/pool.d/www.conf. Измените параметры в соответствии с требованиями сервера:

listen = /run/php/php7.4-fpm.sock
user = www-data
group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

Затем запустите службу и добавьте в автозагрузку:

sudo systemctl enable php7.4-fpm
sudo systemctl start php7.4-fpm

Проверьте статус работы:

sudo systemctl status php7.4-fpm

Типичная ошибка: ERROR: unable to bind listening socket – возникает, если сокет уже занят или отсутствуют права. Решение: проверьте, не запущен ли другой FPM-процесс (случайный остаток после обновления), и задайте корректные параметры listen.user и listen.group равные пользователю веб-сервера (обычно www-data).

Ошибка: PHP Fatal error: Call to undefined function – не установлены необходимые расширения. Установите их через php7.4-название.

Как установить PHP 7.4 FPM из исходного кода для максимальной гибкости?

Компиляция из исходников подходит, если требуется нестандартная конфигурация (например, включить экспериментальные расширения или изменить пути). Скачайте архив с официального сайта PHP, распакуйте, выполните конфигурацию с нужными опциями, соберите и установите.

wget https://www.php.net/distributions/php-7.4.33.tar.gz
tar -xzf php-7.4.33.tar.gz
cd php-7.4.33
./configure --prefix=/usr/local/php74 \
    --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data \
    --with-mysqli --with-pdo-mysql --with-curl --with-gd --with-xml --with-mbstring
make -j$(nproc)
sudo make install

После установки скопируйте конфигурацию пула из исходников:

sudo cp php.ini-production /usr/local/php74/lib/php.ini
sudo cp /usr/local/php74/etc/php-fpm.conf.default /usr/local/php74/etc/php-fpm.conf
sudo cp /usr/local/php74/etc/php-fpm.d/www.conf.default /usr/local/php74/etc/php-fpm.d/www.conf

Запустите PHP-FPM:

sudo /usr/local/php74/sbin/php-fpm

Проблема: после компиляции могут отсутствовать необходимые системные библиотеки (например, libxml2-dev). Установите их заранее: sudo apt install libxml2-dev libcurl4-openssl-dev libgd-dev libonig-dev.

Если сервер не видит сокет – проверьте права и путь listen = /usr/local/php74/var/run/php-fpm.sock (или настройте через TCP порт).

Как настроить PHP 7.4 FPM в изолированном контейнере Docker?

Использование Docker позволяет быстро развернуть FPM без влияния на основную систему. Используйте образ php:7.4-fpm.

docker pull php:7.4-fpm
docker run -d --name php-fpm -p 9000:9000 -v /path/to/app:/var/www/html php:7.4-fpm

Для задания собственных параметров пула создайте Dockerfile и скопируйте конфигурацию:

FROM php:7.4-fpm
COPY www.conf /usr/local/etc/php-fpm.d/www.conf
RUN docker-php-ext-install pdo_mysql mysqli

Ошибка: контейнер не видит расширения – используйте docker-php-ext-install или docker-php-ext-configure.

При монтировании томов следите за правами: пользователь внутри контейнера (www-data) должен иметь доступ к файлам.

Как установить PHP 7.4 FPM на CentOS 7 с помощью репозитория Remi?

Для CentOS/RHEL наиболее удобен репозиторий Remi. Установите EPEL и Remi, затем выберите версию PHP.

sudo yum install epel-release -y
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
sudo yum install yum-utils -y
sudo yum-config-manager --enable remi-php74
sudo yum install php php-fpm php-mysqli php-curl php-gd php-xml php-mbstring -y

Настройки пула находятся в /etc/php-fpm.d/www.conf. Запустите службу:

sudo systemctl enable php-fpm
sudo systemctl start php-fpm

После установки может потребоваться отключить SELinux или настроить контекст для сокета: sudo setsebool -P httpd_can_network_connect 1.

Если сервер Apache не может соединиться с FPM, убедитесь, что модуль proxy_fcgi включён, и используйте сокет или порт.

Расширенные примеры конфигурации и использования PHP 7.4 FPM

Настройка нескольких пулов для разных сайтов

Создайте отдельные пулы для приложений с разными требованиями. Например, для сайта site1 и site2.

Пример
sudo nano /etc/php/7.4/fpm/pool.d/site1.conf
[site1]
listen = /run/php/php7.4-fpm-site1.sock
user = site1user
group = site1user
pm = dynamic
pm.max_children = 20
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 10
request_terminate_timeout = 60s

sudo nano /etc/php/7.4/fpm/pool.d/site2.conf
[site2]
listen = /run/php/php7.4-fpm-site2.sock
user = site2user
group = site2user
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s

После перезапуска FPM оба пула будут работать. Веб-сервер (например, Nginx) использует разные сокеты:

Пример
# в конфигурации Nginx для site1
location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.4-fpm-site1.sock;
    ...
}
# для site2
location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.4-fpm-site2.sock;
    ...
}

Использование медленного лога для поиска узких мест

Включите slow log в пуле, чтобы записывать все запросы, выполняющиеся дольше указанного времени.

Пример
[www]
...
request_slowlog_timeout = 5s
slowlog = /var/log/php7.4-fpm-slow.log

Пример записи:

[22-Jun-2024 14:30:45]  [pool www] pid 1234
script_filename = /var/www/html/index.php
[0x00007f1234567890] sleep() /var/www/html/slow.php:2

Настройка статусной страницы для мониторинга

Включите pm.status_path, чтобы получать JSON или HTML со статистикой пула.

Пример
[www]
...
pm.status_path = /status
ping.path = /ping

В конфигурации веб-сервера разрешите доступ (например, через Nginx):

Пример
location ~ ^/(status|ping)$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    allow 127.0.0.1;
    deny all;
}

Результат запроса curl http://localhost/status:

{"pool":"www","process manager":"dynamic","start time":1719078000,"start since":12345,"accepted conn":1500,"listen queue":0,"max listen queue":0,"listen queue len":128,"idle processes":3,"active processes":7,"total processes":10,"max active processes":12,"max children reached":0,"slow requests":2}

Управление переменными окружения

Передайте переменные окружения в PHP-FPM через конфигурацию пула или глобально.

Пример
[www]
...
env[APP_ENV] = production
env[DB_HOST] = 127.0.0.1
env[DB_NAME] = mydb

В PHP переменные доступны через $_ENV или getenv().

Оптимизация параметров pm для производительности

Для высоконагруженных систем используйте статический режим pm с фиксированным числом процессов:

Пример
pm = static
pm.max_children = 100

Для экономии памяти на низконагруженных – ondemand:

Пример
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 30s

Мониторинг текущего состояния: ps aux | grep php-fpm.

Настройка chroot для изоляции пула

PHP-FPM может работать в chroot-окружении для дополнительной безопасности.

Пример
[www]
...
chroot = /var/www/site1
chdir = /

При этом необходимо, чтобы внутри chroot были все необходимые библиотеки и устройство /dev/urandom. Это сложный вариант, требующий тщательной настройки.

Использование systemd override для тонкой настройки сервиса

Создайте drop-in файл для изменения параметров службы (например, лимита открытых файлов).

Пример
sudo mkdir -p /etc/systemd/system/php7.4-fpm.service.d
sudo tee /etc/systemd/system/php7.4-fpm.service.d/limits.conf <

Проверьте новые лимиты:

sudo systemctl show php7.4-fpm | grep LimitNOFILE
LimitNOFILE=65536

Установка и настройка PHP 7.4 FPM - comments

En
Php 7.4 fpm (php)