Как настроить logrotate для нескольких экземпляров httpd |

Как настроить logrotate для нескольких экземпляров httpd

Мануал

Проблема

При запуске нескольких экземпляров httpd на одном хосте (то есть, как предлагается в этом посте) с включенным SELinux и в принудительном режиме, использование одной конфигурации logrotate для ротации журнала может завершиться неудачно, если используется скрипт postrotate, подобный следующему:

postrotate
      /bin/systemctl reload httpd*.service > /dev/null 2>/dev/null || true
endscript

Команда «systemctl reload httpd * .service» работает из командной строки, однако политика SELinux не позволяет logrotate перечислять активные службы, соответствующие шаблону httpd * .service, при запуске в качестве задания cron или anacron с отказом AVC в файле audit.log, аналогичном следующему:

type=USER_AVC msg=audit(1523410562.012:837): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc:  denied  { status } for auid=0 uid=0 gid=0 cmdline="/bin/systemctl reload httpd*.service" scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=system_u:system_r:init_t:s0 tclass=system  exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'

Решение

Эту проблему можно решить, отправив сигнал USR1 основным процессам httpd.

Это приведет к постепенному перезапуску дочерних процессов httpd, перезагрузке конфигурации и повторному открытию файлов журнала.

Мы можем получить PID основных процессов, прочитав PID-файлы отдельных экземпляров httpd, как указано в их соответствующих файлах конфигурации httpd.conf.

В следующем примере все файлы конфигурации httpd.conf всех экземпляров соответствуют шаблону /etc/httpd/conf/httpd*.conf, а файлы PID соответствуют /var/run/httpd*.pid:

# grep PidFile /etc/httpd/conf/httpd*.conf
/etc/httpd/conf/httpd1.conf:PidFile "/var/run/httpd1.pid"
/etc/httpd/conf/httpd2.conf:PidFile "/var/run/httpd2.pid"
/etc/httpd/conf/httpd3.conf:PidFile "/var/run/httpd3.pid"

Примечание: пожалуйста, убедитесь, что вы настроили шаблон в соответствии со схемой именования, используемой в вашей среде!

Затем скрипт, подобный следующему, можно использовать в разделе postrotate вашего файла конфигурации /etc/logrotate.d/httpd:

# vi /etc/logrotate.d/httpd
postrotate
    for pidfile in $(ls -1 /var/run/httpd*.pid); do
        PID=$(cat "$pidfile")
        if grep -qa "/usr/sbin/httpd" /proc/$PID/cmdline; then
            kill -USR1 $PID
        fi
    done || true
endscript

Примечание. Обратите внимание, что приведенный выше скрипт является лишь примером и может потребовать изменений в вашей среде.

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий