Конфигурирование окружения PHP для веб-проектов
Основные аспекты настройки PHP
Рекомендуемое решение: PHP-FPM с выделенными пулами
Использование PHP-FPM (FastCGI Process Manager) позволяет гибко управлять процессами PHP, изолировать пулы для разных сайтов и тонко настраивать параметры производительности. Этот подход подходит для большинства современных веб-серверов (nginx, Apache с mod_proxy_fcgi).
Как настроить базовый пул PHP-FPM?
Пулы определяются в файлах конфигурации, обычно расположенных в /etc/php/*/fpm/pool.d/. Пример пула www.conf:
[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500
Директива pm определяет режим управления процессами. dynamic автоматически регулирует количество дочерних процессов. pm.max_children - максимальное число одновременных запросов.
Типичная ошибка: 502 Bad Gateway
Часто возникает, если сокет не создается из-за несовпадения пользователя/группы в конфигурации пула и веб-сервера. Решение: проверить listen.owner и listen.group, а также права на директорию /run/php/.
Как изменить лимиты памяти и времени выполнения?
Настройки php.ini можно переопределить в файле пула через php_admin_value. Пример:
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 60
php_admin_value[upload_max_filesize] = 100M
php_admin_value[post_max_size] = 120M
Это изоляция позволяет задавать разные лимиты для каждого сайта.
Вариант 1: mod_php (Apache)
Когда удобно использовать встроенный модуль PHP в Apache?
Если на сервере работает только один сайт или все приложения используют одни и те же настройки PHP, mod_php (php_module) проще в настройке. Не требуется отдельный процесс-менеджер. Настройки задаются в .htaccess или httpd.conf:
php_value memory_limit 256M
php_value upload_max_filesize 100M
Проблема: смешивание конфигураций для разных виртуальных хостов
Все виртуальные хосты используют один процесс PHP, поэтому изменение настроек для одного сайта влияет на все. Решение: использовать PHP-FPM с пулами или контейнеризацию.
Вариант 2: PHP-CGI (устаревший)
Как настроить PHP через CGI для совместимости со старыми системами?
Запуск php-cgi с помощью suPHP или FastCGI. Пример конфигурации для Apache:
Action application/x-httpd-php /cgi-bin/php
<Directory /cgi-bin>
SetHandler application/x-httpd-php-cgi
</Directory>
Недостаток: каждый запрос порождает новый процесс
Высокое потребление ресурсов при большом трафике. Рекомендуется заменять на PHP-FPM.
Вариант 3: .user.ini файлы
Как переопределить параметры PHP для конкретной директории без доступа к основному конфигу?
Размещение файла .user.ini в корне приложения. Пример:
memory_limit = 128M
max_execution_time = 30
display_errors = Off
log_errors = On
Действует только для текущей папки и подпапок. Не поддерживается в режиме CGI.
Ошибка: директивы не применяются
Проверить user_ini.filename в php.ini (по умолчанию .user.ini) и убедиться, что используется FastCGI или FPM.
Вариант 4: Docker-контейнеры
Как добиться полной изоляции окружения PHP для каждого проекта?
Использование образов PHP с официального Docker Hub. Пример docker-compose.yml:
version: '3'
services:
php:
image: php:8.2-fpm
volumes:
- ./app:/var/www/html
restart: unless-stopped
environment:
PHP_MEMORY_LIMIT: 256M
Каждый контейнер имеет собственный php.ini.
Сложность: управление несколькими контейнерами
Требуется оркестратор (Docker Compose, Kubernetes) и мониторинг.
Расширенные примеры конфигурации PHP
Как настроить OpCache для ускорения выполнения?
OpCache кэширует скомпилированный байт-код PHP. Рекомендуемые параметры для production:
; /etc/php/*/cli/conf.d/10-opcache.ini (или в пуле)
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
opcache.validate_timestamps=0 ; для стабильной версии
Результат: ускорение выполнения скриптов до 2-3 раз.
Как настроить статический режим pm для высоконагруженных проектов?
Вместо dynamic используется static с фиксированным числом процессов.
pm = static
pm.max_children = 20
Преимущество: нет накладных расходов на динамическое управление.
Как включить медленное логирование для выявления долгих запросов?
; в пуле
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s
Запросы, выполняющиеся дольше 5 секунд, попадают в лог с трассировкой стека.
Как настроить обработку ошибок и логирование?
; php.ini
error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
date.timezone = Europe/Moscow
Ошибки записываются в файл, пользователю не показываются.
Как включить необходимые расширения PHP?
; Установка через пакетный менеджер (Debian/Ubuntu)
sudo apt install php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring php8.2-xml php8.2-zip
; Включение в php.ini или пуле:
extension=mysqli
extension=curl
extension=gd
После перезапуска PHP-FPM расширения становятся доступны.
Как использовать status page PHP-FPM для мониторинга?
; в пуле
pm.status_path = /status
ping.path = /ping
; в nginx добавить location:
location ~ ^/(status|ping)$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
allow 127.0.0.1;
deny all;
}
Обращение к /status возвращает JSON или HTML со статистикой пула.