Настройка логирования HAProxy в CentOS
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: CentOS, CentOS 8, HAProxy, rsyslog, SELinux