Настройка PHP 7.4 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-mbstringPhp 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