Настройка логирования HAProxy в CentOS

HAProxy (High Availability Proxy) – это широко используемый прокси-сервер на основе TCP и HTTP, который работает в Linux, Solaris и FreeBSD. Он используется для балансировки нагрузки приложений путем распределения запросов между несколькими серверами и обеспечения высокой доступности приложений для пользователей.

По умолчанию во многих установках CentOS 8 HAProxy не настроен для записи вывода логов в файл. В этом кратком руководстве объясняется, как настроить логирование HAProxy с помощью Rsyslog по сокету домена Unix – это обеспечит надежность, скорость и безопасность.

Требования

Для выполнения этого руководства вам понадобится сервер CentOS 8. На этом сервере должен быть пользователь с правами администратора (не root). Чтобы настроить этот сервер, следуйте руководству по начальной настройке.

1: Установка и включение HAProxy

Чтобы установить HAProxy, выполните следующую команду dnf:

sudo dnf install haproxy

При появлении запроса Is this ok [y/N]: введите y и нажмите Return, чтобы установить пакет.

После того, как вы установили HAProxy, включите и запустите его с помощью команды systemctl:

sudo systemctl enable haproxy.service

Вы должны получить следующий вывод:

Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.

Теперь, когда сервис HAProxy включен, вы можете запустить его, чтобы он работал на вашем сервере с конфигурацией по умолчанию:

sudo systemctl start haproxy.service

Затем проверьте статус HAProxy, чтобы убедиться, что все работает:

sudo systemctl status haproxy.service

Вы должны получить подобный результат.

haproxy.service - HAProxy Load Balancer
     Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2020-09-09 21:16:39 UTC; 4min 39s ago
   Process: 21340 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS)
   Main PID: 21341 (haproxy)
      Tasks: 2 (limit: 2881)
     Memory: 2.7M
     CGroup: /system.slice/haproxy.service
             ├─21341 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
. . .

Обратите внимание на строку active (running). Если вы получили такой же результат, то HAProxy работает правильно, и вы можете продолжить настройку логирования.

Однако если ваши выходные данные отличаются (к примеру, отображается статус Active: failed), вам нужно определить, что мешает правильному запуску HAProxy, устранить неполадки и только потом продолжать настройку.

Читайте также: Общие ошибки HAProxy и как их устранить

Убедившись, что HAProxy включен и работает, вы можете перейти к следующему шагу – к настройке директив логирования HAProxy.

2: Настройка директив логирования HAProxy

Чтобы настроить логирование HAProxy, откройте файл /etc/haproxy/haproxy.cfg в vi или любом другом редакторе:

sudo vi /etc/haproxy/haproxy.cfg

Нажмите i, чтобы переключиться в режим вставки, затем найдите строку log 127.0.0.1 local2 и закомментируйте ее, добавив символ # в начало, как показано в следующем примере:

. . .
# 2) configure local2 events to go to the /var/log/haproxy.log
#   file. A line like the following can be added to
#   /etc/sysconfig/syslog
#
#    local2.*                       /var/log/haproxy.log
#
    #log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
. . .

Теперь сразу после закомментированной строки добавьте такую строку:

    log         /dev/log local0

Весь отредактированный вами раздел /etc/haproxy/haproxy.cfg должен иметь следующие данные:

. . .
#    local2.*                       /var/log/haproxy.log
#
     #log         127.0.0.1 local2
     log         /dev/log local0

     chroot      /var/lib/haproxy
     pidfile     /var/run/haproxy.pid
. . .

Директива chroot важна, потому что она ограничивает доступ HAProxy только файлами в каталоге /var/lib/haproxy. Строка log /dev/log local0 создаст внутри этого каталога файл, который Rsyslog будет использовать для сбора записей логов.

Закончив редактирование файла /etc/haproxy/haproxy.cfg, сохраните и закройте его.

Последний шаг, который вам нужно выполнить в этом разделе, — это создать каталог /var/lib/haproxy/dev, так как по умолчанию он не существует.

Создайте этот каталог с помощью команды mkdir, а затем перезапустите HAProxy:

sudo mkdir /var/lib/haproxy/dev
sudo systemctl restart haproxy.service

HAProxy готов регистрировать свои логи в сокет Unix, который находится в каталоге /var/lib/haproxy/dev/log. Далее мы настроим Rsyslog для создания сокета и доступа к нему.

3: Настройка Rsyslog для сбора логов HAProxy

Стандартная конфигурация Rsyslog в CentOS 8 не обрабатывает логи HAProxy. Чтобы собирать логи сервиса HAProxy, откройте новый файл /etc/rsyslog.d/99-haproxy.conf с помощью vi или любого другого редактора:

sudo vi /etc/rsyslog.d/99-haproxy.conf

Нажмите i, чтобы переключиться в режим вставки, затем добавьте в файл следующие строки:

AddUnixListenSocket /var/lib/haproxy/dev/log

# Send HAProxy messages to a dedicated logfile
:programname, startswith, "haproxy" {
  /var/log/haproxy.log
  stop
}

Директива $AddUnixListenSocket создаст сокет домена Unix в указанном месте, в данном случае это каталог /var/lib/haproxy/dev/log. Раздел :programname, startupwith, “haproxy” определяет файл, в который Rsyslog будет записывать логи, собранные из сокета.

Закончив редактирование /etc/rsyslog.d/99-haproxy.conf, сохраните и закройте файл.

Rsyslog настроен для чтения записей логов из сокета домена Unix в /var/lib/haproxy/dev/log и записи их в лог-файл в /var/log/haproxy.log.

Однако перед перезапуском Rsyslog необходимо определить, обеспечивает ли SELinux контроль доступа в вашей системе CentOS 8.

Проверить политику SELinux можно с помощью команды:

getenforce

Вы получите один из нижеперечисленных ответов:

  • Enforcing — в этом режиме SELinux обеспечивает контроль доступа в вашей системе. Опционально вы можете обратиться к разделу 4 этого мануала.
  • Permissive — в этом случае SELinux регистрирует все попытки доступа к своему лог-файлу, но не применяет контроль доступа в вашей системе.
  • Disabled — если SELinux отключен, то он ничего не регистрирует и не применяет никаких политик управления доступом в вашей системе.

Если команда getenforce вернула Permissive или Disabled, вы можете перезапустить Rsyslog с помощью следующей команды:

sudo systemctl restart rsyslog

После перезапуска Rsyslog вы сможете просматривать логи в файле /var/log/haproxy.log, который вы настроили в /etc/rsyslog.d/99-haproxy.conf. Перейдите к разделу 5.

В противном случае, – если в вашей системе SELinux работает в режиме Enforcing, – читайте раздел 4, в котором объясняется, как добавить модуль, позволяющий Rsyslog и HAProxy взаимодействовать друг с другом через общий сокет домена Unix.

4: Настройка SELinux

Если SELinux работает в режиме Enforcing, вам необходимо разрешить Rsyslog доступ к каталогу chroot HAProxy. Это позволит Rsyslog создать сокет домена Unix, на который HAproxy будет отправлять свои логи.

Читайте также: Введение в SELinux в CentOS 7: базовые понятия

Чтобы Rsyslog и HAProxy имели доступ к их общему сокету, первая задача — создать файл политики Type Enforcement. Откройте новый файл rsyslog-haproxy.te в vi или любом другом редакторе:

vi rsyslog-haproxy.te

Нажмите i, чтобы переключиться в режим INSERT, а затем вставьте в файл следующие строки:

module rsyslog-haproxy 1.0;

require {
    type syslogd_t;
    type haproxy_var_lib_t;
    class dir { add_name remove_name search write };
    class sock_file { create setattr unlink };
}

#============= syslogd_t ==============
allow syslogd_t haproxy_var_lib_t:dir { add_name remove_name search write };
allow syslogd_t haproxy_var_lib_t:sock_file { create setattr unlink };

Первая строка определяет имя и версию модуля. Раздел require сообщает загрузчику модулей SELinux о типах и классах, которые необходимы для загрузки политики в виде модуля. Последние две строки — это правила, которые открывают Rsyslog доступ к файлам chroot и сокету HAProxy соответственно.

Отредактировав файл, сохраните и закройте его.

Затем запустите следующую команду, чтобы установить пакет checkpolicy, содержащий утилиту checkmodule, с помощью которой мы превратим файл Type Enforcement в модуль SELinux.

sudo dnf install checkpolicy

Инструмент checkmodule установлен, и нашим следующим шагом будет компиляция модуля и загрузка его в SELinux. Запустите следующую команду, чтобы скомпилировать файл Type Enforcement в модуль SELinux:

checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod

Затем запустите semodule_package, чтобы сгенерировать полный пакет политик, который SELinux может загрузить в ядро ​​Linux:

semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod

Последним шагом будет загрузка созданного нами пакета в ядро ​​Linux с помощью команды semodule:

sudo semodule -i rsyslog-haproxy.pp

Добавление модуля может занять несколько секунд. После выполнения команды вы можете подтвердить, что модуль загружен в ядро, выполнив команду semodule:

sudo semodule -l |grep rsyslog-haproxy

Вы должны получить следующий вывод:

rsyslog-haproxy

После загрузки модуля вы можете перезапустить Rsyslog с помощью следующей команды:

sudo systemctl restart rsyslog

Итак, мы определили, скомпилировали и загрузили политику SELinux, которая позволит HAProxy и Rsyslog обмениваться данными через их общий сокет.

5: Тестирование логирования HAProxy

Теперь, когда вы настроили HAProxy, Rsyslog (и, возможно, SELinux), вы можете проверить, работает ли логирование в /var/log/haproxy.log.

По умолчанию пакет haproxy поставляется с конфигурационным файлом, который создает прослушивающий сокет HTTP на порту 5000. Конфигурация указывает на несуществующий внутренний сервер, поэтому любой запрос к порту приведет к ошибке HTTP 503.

Чтобы проверить ошибку 503 в вашем файле /var/log/haproxy.log, сначала сгенерируйте HTTP-запрос с помощью curl:

curl -si http://127.0.0.1:5000

Вы получите такой вывод:

HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html

<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>

Теперь проверьте /var/log/haproxy.log на наличие записей HTTP 503 с помощью команды grep:

sudo grep -E ‘NOSRV.+503’ /var/log/haproxy.log

Примечание: Часть NOSRV.+503 является регулярным выражением.

Читайте также: Использование Grep и регулярных выражений для поиска текстовых шаблонов в Linux

Вы должны получить одну или несколько строк, как показано ниже:

Sep 9 21:32:22 centos-s-1vcpu-1gb-nyc3-01 haproxy[4451]: 127.0.0.1:56024 [9/Sep/2020:21:32:22.098] main app/<NOSRV> 0/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

Эта строка соответствует сделанному вами запросу curl, а из этого следует, что Rsyslog и HAProxy правильно используют свой общий сокет.

Итоги

В этом кратком руководстве мы настроили HAProxy для регистрации логов в сокет домена Unix, а также настроили Rsyslog для создания и чтения данных из сокета, чтобы две программы могли взаимодействовать друг с другом, не открывая никаких портов TCP/IP в вашей системе. Кроме того, мы дополнительно скомпилировали, упаковали и загрузили политику SELinux, чтобы разрешить общий доступ Rsyslog и HAProxy к их сокету.

Tags: , , , ,

Добавить комментарий