tgoop.com/srv_admin/4667
Last Update:
Если вам приходится обслуживать сайты, работающие на php, то расскажу про небольшую настройку, которая по умолчанию отключена, но в некоторых случаях её имеет смысл включить. Речь пойдёт про логирование использования функции mail(), с помощью которой можно отправлять email сообщения.
Хорошо, если веб приложение умеет использовать сторонние SMTP сервера для отправки почты, а не прямую отправку через встроенную функцию. Но это не всегда так. Другая сторона медали - если сайт или хостинг взломают, то часто начинают слать спам через php напрямую. Это самое популярное использование взломанного каким-нибудь ботом сайта через публичную уязвимость. Через него либо сразу спам начинают слать, либо ддосить кого-нибудь, реже - майнить. Майнинг сразу видно по возросшей нагрузке. А вот почту можно и не заметить.
Я обычно в таких случаях ставлю для локальной отправки postfix и слежу за его логом. Если вы с почтовыми серверами не особо знакомы, а вам нужен просто список отправленных писем, где одно письмо - одна строчка, то с логированием сдрествами php будет проще всего. К тому же этот лог в том числе покажет, какой конкретно скрипт сделал отправку, что в логе почтового сервера не увидеть, там этой информации в принципе нет.
Идём в настройки php, в файл php.ini
и раскомментируем там строку:mail.log = syslog
Можно направить вывод в какой-то текстовый файл вместо syslog, но могут возникнуть нюансы с доступом, если, к примеру, у вас используется php-fpm и для каждого сайта запускается пул под своим отдельным пользователем. Использовать syslog как единое централизованное хранилище - более универсальное решение. Но тут уже вам решать, как удобнее, в зависимости от ваших настроек. Можно и из syslog сложить все записи в отдельный файл, отфильтровав их по вхождению фразы mail().
Для этого рисуем конфиг для rsyslog в файле /etc/rsyslog.d/php-mail.conf
::msg, contains, "mail()" /var/log/mail-php.log
& stop
Перезапускаем rsyslog:# systemctl restart rsyslog
И перезапускаем службу php в зависимости от того, в каком виде она используется. Отдельно отмечу, что, к примеру, в Debian файл php.ini для модуля Apache, для php-fpm, для запуска консольных скриптов через cli свой. Не перепутайте, куда будете вносить правки. Либо вносите сразу во все. Лучше создать отдельный файл, вместо правки общего. То есть для php-fpm кладём настройку примерно сюда: /etc/php/8.2/fpm/conf.d/mail-log.conf
.
Принудительно проверить работу можно простейшим скриптом такого содержания:<?php
$to = "[email protected]";
$subject = "Привет от PHP!";
$message = "Это тестовое письмо, отправленное через PHP скрипт.";
mail($to, $subject, $message);
?>
Запускаем скрипт:# php mail.php
В файле /var/log/mail-php.log
наблюдаем запись:2025-06-09T00:07:09.607068+03:00 debian12-vm php: mail() on [/root/mail.php:5]: To: [email protected] -- Headers: -- Subject: Привет от PHP!
Видим скрипт /root/mail.php
и конкретную строку 5, где сработала функция mail(). Это может очень пригодится при отладке неправомерных отправлений с сервера.
Не забудьте настроить ротацию этого файла, если будете хранить лог в отдельном файле. Добавьте примерно такой конфиг для logrotate в файле /etc/logrotate.d/mail-php
:/var/log/mail-php.log {
rotate 30
daily
missingok
notifempty
compress
olddir /var/log/old
}
Я обычно складываю все старые логи в отдельную директорию. Не забудьте её создать, если скопируете этот конфиг. Если будете логировать не по дням, а по размеру файла, то не забудьте настроить запуск logrotate чаще, чем раз в сутки. И так же туда надо будет добавить вместо daily дополнительные параметры: size=50M
dateext
dateformat -%Y-%m-%d_%H-%s
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#webserver #php
BY ServerAdmin.ru

Share with your friend now:
tgoop.com/srv_admin/4667