Конфигурирование окружения PHP для веб-проектов

Раздел: Администрирование 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 со статистикой пула.

Настройка PHP сервера - comments

En
настройка php сервера (php)