Вопрос или проблема
Окружение – RHEL 9.5, Apache 2.4.62 с сервером MPM = event, PHP 7.4.33 с PHP-FPM
Преамбула – ранее мы могли использовать такие настройки в каждом файле .HTACCESS, чтобы устанавливать для каждого виртуального хоста директивы, такие как
php_flag log_errors on
php_value error_reporting 22517 # получено с помощью - echo E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_WARNING & ~E_NOTICE ;
php_value error_log /var/log/php_errors/example1_com_errors.log
Это было очень логично и удобно, потому что один сайт находится в производственном режиме и требует собственного уровня отчетности об ошибках, а другой сайт – в режиме разработки и требует другого уровня отчетности об ошибках.
Не говоря уже о том, что мы могли хранить ошибки в разных файлах.
Теперь у нас есть следующие факторы
- EL-8 теперь использует php-fpm по умолчанию (mod_php все еще доступен, если вы переключитесь на prefork) – а EL-9 предоставляет только php-fpm (полный ответ от Remi Colet на StackOverflow)
- Таким образом, с EL-9 мы ДОЛЖНЫ использовать Apache с php-fpm в режиме “mpm_event”
- Мы не можем использовать php_value или php_flag с модулем Apache mpm_event из-за ошибки
“Invalid command ‘php_flag’, perhaps misspelled or defined by a module not included in the server configuration”. - В то же время – рекомендуемый для PHP-FPM файл “.user.ini” просто НЕ ПОЗВОЛЯЕТ таких возможностей, как указано выше! Смотрите https://www.php.net/manual/en/configuration.file.per-user.php – Только настройки INI с режимами INI_PERDIR и INI_USER будут распознаны в INI-файлах стиля .user.ini.
Я удивлён таким сокращением удобного и необходимого функционала без решений от сетевого сообщества. Возможно, где-то существует “скрытое решение”, но я его не нашел.
Поиск в Google мало помог, возвращая главным образом аналогичные скопированные ответы о старом способе настройки.
Мой вопрос – в указанном выше окружении (mpm_event, PHP-FPM и т.д.) – можно ли каким-то образом настроить ТАКОЙ ЖЕ функционал – для каждого виртуального хоста настроить собственный уровень ошибок php и хранить в собственном файле журнала ошибок php?
Спасибо за мнения и подсказки, чтобы попробовать,
.
Ответ или решение
Учитывая ваш вопрос о настройке отдельных файлов журнала ошибок PHP для каждого виртуального хоста в окружении RHEL 9.5 с использованием Apache 2.4.62 в режиме "mpm_event" и PHP 7.4.33 с PHP-FPM, стоит обратить внимание на несколько моментов, чтобы достичь желаемого результата. Ранее, как вы упомянули, настройка через .htaccess была простой и удобной, однако в текущих условиях с PHP-FPM требуется иной подход.
Теория
С внедрением PHP-FPM появились некоторые ограничения в отношении директив, которые можно интегрировать непосредственно в конфигурации Apache и PHP. В частности, исходя из работы Apache с модулем "mpm_event", использование директив php_value
и php_flag
становится невозможным. Эти директивы применимы только в модуле "mod_php", который, однако, несовместим с режимом "mpm_event". Дополнительно, файл ".user.ini" имеет ограничения и не позволяет напрямую задавать уровни логирования ошибок или пути к файлам.
Чтобы обойти эти ограничения, необходимо полностью задействовать функциональность PHP-FPM и учитывать конфигурации на уровне пула процессов (pool). Конфигурация пулов PHP-FPM может быть использована для задания разных уровней логирования ошибок и путей к файлам логов для каждого виртуального хоста.
Пример
-
Конфигурация пула PHP-FPM: Каждый пул процессов может иметь свои уникальные настройки, которые задаются в конфигурационных файлах, обычно расположенных в
/etc/php-fpm.d/
. Например, создайте файл конфигурации для одного виртуального хоста, скажемexample1.conf
:[example1] user = www-data group = www-data listen = /run/php-fpm-example1.sock pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 php_admin_value[error_log] = /var/log/php_errors/example1_com_errors.log php_admin_value[log_errors] = on php_admin_value[error_reporting] = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_WARNING & ~E_NOTICE
-
Настройка виртуального хоста Apache: Убедитесь, что конфигурация виртуального хоста ссылается на соответствующий сокет PHP-FPM:
<VirtualHost *:80> ServerName example1.com DocumentRoot /var/www/example1 <FilesMatch \.php$> SetHandler "proxy:unix:/run/php-fpm-example1.sock|fcgi://localhost/" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/example1_error.log CustomLog ${APACHE_LOG_DIR}/example1_access.log combined </VirtualHost>
-
Перезагрузка служб: После изменения конфигурации, перезагрузите службы php-fpm и Apache для применения изменений:
sudo systemctl restart php-fpm sudo systemctl restart httpd
Применение
С использованием вышеописанной методологии, можно настроить отдельные уровни ошибок и файлы журналов для каждого виртуального хоста, что позволяет адаптировать системы к условиям эксплуатации и разработки каждого отдельного сайта. Пусть это и лишает некоторой универсальности метода .htaccess
, но предоставляет более высокую степень контроля за каждым отдельным окружением и позволяет максимально рационально использовать ресурсы сервера, оптимизируя производительность и безопасность.
Для дальнейшего укрепления этой системы, рекомендуется регулярно проверять созданные логи и настраивать ротацию файлов журналов, чтобы избежать их чрезмерного роста. Интеграция с системами мониторинга может также помочь в автоматизированном отслеживании ошибок и предупреждений, предоставляя своевременную информацию о сбоях и проблемах в работе.
Таким образом, переход к PHP-FPM с соответствующей настройкой пула процессов для каждого виртуального хоста вопреки некоторым ограничениям предоставляет возможности для детальной кастомизации, соответствующей современным стандартам безопасности и производительности.