#Что происходит и как определить неисправность
На рабочем PHP-сайте ошибки лучше писать в закрытый журнал, не показывая посетителям пути, запросы и технические сообщения. Для этого нужны log_errors, отключённый display_errors, доступный путь журнала и проверка, что файлы логов не отдаются веб-сервером.
#Вероятные причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Ошибки выводятся прямо в HTMLОшибки выводятся прямо в HTML. Посетители видят warning, stack trace или пути | Посетители видят warning, stack trace или пути | Настроить display_errors=Off для веб-обработчика. |
| Журнал не записываетсяЖурнал не записывается. Нет файла или у PHP нет права на каталог | Нет файла или у PHP нет права на каталог | Проверить log_errors, путь error_log, права и место. |
| Редактируется CLI вместо FPMРедактируется CLI вместо FPM. Скрипт из терминала пишет ошибки, а сайт нет | Скрипт из терминала пишет ошибки, а сайт нет | Настроить правильный пул и конфигурацию PHP сайта. |
#Пошаговая диагностика и исправление
- Определите, где сейчас появляются ошибкиОткройте проблемную страницу без персональных данных, посмотрите HTML и журнал сервера в панели. Если вывод виден пользователю, задача первоочередная: публичные сообщения могут раскрывать расположение файлов и другие детали.
- Уточните версию PHP и способ запускаВ панели домена найдите версию PHP, режим PHP-FPM/CGI/Apache и расположение журнала ошибок. На общем хостинге путь и права редактирования могут быть закрыты — запросите у провайдера, не меняйте конфигурацию соседних сайтов.
- Сохраните резервную копию настроекПеред изменением сохраните конкретный php.ini/.user.ini или правила пула. Планируйте проверку в низкую нагрузку; изменение display_errors может скрыть симптомы у тестировщика, поэтому подготовьте отдельную безопасную точку просмотра журнала.
- Установите конфигурацию в подходящем местеВ редакторе настроек конкретного веб-пула установите log_errors=On, display_errors=Off, display_startup_errors=Off; для error_log используйте приватный путь вне document root, который доступен на запись нужному процессу. Это строки ini, а не команды оболочки.
- Пример содержимого php.ini или разрешённого уровня конфигурации; не вводить в терминалINIПример содержимого php.ini или разрешённого уровня конфигурации; не вводить в терминал.
log_errors = On display_errors = Off display_startup_errors = Off
- Проверьте место и права журналаУбедитесь, что каталог журнала существует, запись разрешена пользователю веб-пула и в разделе достаточно места. Не создавайте логи внутри публичных uploads; не применяйте chmod 777 и не делайте файл доступным всем.
- Примените настройки точечного обработчикаНажмите «Применить» в панели или организуйте предусмотренную перезагрузку именно нужного PHP-FPM. Не запускайте systemctl restart php-fpm наугад: имя зависит от версии и дистрибутива. Проверяйте статус сайта сразу после изменения.
- Проверьте запись на тестовой копииНа закрытом тестовом адресе создайте управляемую запись error_log("WHELP test error log marker") из безопасного фрагмента PHP. Убедитесь, что маркер есть в закрытом журнале, но не попал в страницу. Удалите тестовый файл и запись с чувствительными данными не создавайте.
- Настройте обслуживание журналаПроверьте ротацию, ограничение размера и права на новые файлы. Если логи идут в stderr/journald контейнера, не пытайтесь создавать отдельный файл без потребности. При внезапном 502 верните конфигурацию из копии и посмотрите статус пула.
#Как проверить результат
В журнале появляется тестовая запись, посетитель не видит предупреждений в HTML, и сам лог нельзя открыть по URL. При повторном запросе сайт продолжает работать.
#Если не помогло
Если log_errors включён, но файл пуст, проверьте фактический путь FPM, stderr контейнера, права и наличие ошибок; пустой файл сам по себе не означает неисправность.