Como configurar o HAProxy Logging com Rsyslog no CentOS 8 [Quickstart]

Introduction

HAProxy, que significa High Availability Proxy, é um servidor proxy baseado em TCP e HTTP amplamente utilizado que roda em Linux, Solaris e FreeBSD. Ele é usado para carregar aplicações balanceadas distribuindo solicitações entre vários servidores, e para garantir que as aplicações estejam altamente disponíveis para os usuários.

Por padrão em muitas instalações CentOS 8, o HAProxy não é configurado para escrever sua saída de log em um arquivo. Este tutorial de início rápido explicará como configurar o log do HAProxy com Rsyslog usando um socket de domínio Unix para confiabilidade, velocidade e segurança.

Prerequisites

Para completar este tutorial, você precisará de um servidor rodando o CentOS 8. Este servidor deve ter um usuário não-root com privilégios administrativos. Para configurar isto, siga o guia de configuração inicial do servidor para o CentOS 8 tutorial.

Passo 1 – Instalando e HAProxy

Para instalar o HAProxy, execute o seguinte dnf comando:

  • sudo dnf install haproxy

Quando for solicitado Is this ok : insira y e pressione RETURN para instalar o pacote.

Após ter instalado o HAProxy, active-o e inicie-o usando o comando systemctl comando:

  • sudo systemctl enable haproxy.service

Deverá receber a seguinte saída:

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

Com o serviço HAProxy agora activo, pode iniciá-lo para garantir que corre com uma configuração predefinida no seu servidor:

  • sudo systemctl start haproxy.service

Próximo examinar o estado do HAProxy para ter a certeza que está a correr:

  • sudo systemctl status haproxy.service

Você deve receber uma saída como a seguinte. Note a parte realçada active (running) da saída. Se o seu servidor mostrar a mesma secção realçada, então o HAProxy está a correr correctamente no seu servidor e pode prosseguir com a configuração de registo.

Output
● 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. . .

Se o seu output for diferente, ou o estado mostrar algo como Active: failed, então siga os passos de resolução de problemas no tutorial Como resolver problemas de erros comuns de HAProxy para determinar o que está a impedir o HAProxy de iniciar correctamente.

Após ter confirmado que o HAProxy está activado e em execução, pode continuar para o próximo passo, que é configurar as directivas de registo do HAProxy.

Passo 2 – Configurar as directivas de registo HAProxy

Para configurar as directivas de registo do HAProxy, abra /etc/haproxy/haproxy.cfg em vi ou o seu editor preferido:

  • sudo vi /etc/haproxy/haproxy.cfg

Pressione i para mudar para o modo INSERT, depois encontre a linha log 127.0.0.1 local2 e comente-a adicionando um caractere # ao início da linha, como realçado no seguinte exemplo:

/etc/haproxy/haproxy.cfg
. . .# 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. . .

Agora adicione uma linha diretamente após a linha comentada com o seguinte conteúdo:

 log /dev/log local0

A seção inteira de /etc/haproxy/haproxy.cfg que você editou deve conter as seguintes linhas:

/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. . .

A linha chroot é importante, porque restringe o processo HAProxy ao acesso a ficheiros apenas no directório /var/lib/haproxy. A linha log /dev/log local0 irá criar um arquivo dentro desse diretório que o Rsyslog irá usar para coletar entradas de log de.

Após você terminar de editar as linhas log em /etc/haproxy/haproxy.cfg, salve e feche o arquivo pressionando ESC, digitando :wq, e pressionando ENTER.

O último passo que precisa de completar nesta secção é criar o directório /var/lib/haproxy/dev uma vez que este não existe por defeito.

Criar o directório usando o comando mkdir e depois reiniciar o HAProxy:

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

Tem agora configurado o HAProxy para enviar os seus logs para um socket de domínio Unix que reside em /var/lib/haproxy/dev/log. No próximo passo, você irá configurar o Rsyslog para criar e acessar o socket.

Passo 3 – Configurando o Rsyslog para coletar logs HAProxy

A configuração padrão do Rsyslog no CentOS 8 não lida com logs HAProxy. Para coletar logs do serviço HAProxy, abra um novo arquivo /etc/rsyslog.d/99-haproxy.conf usando vi ou seu editor preferido:

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

Pressione i para mudar para o modo INSERT, então cole as seguintes linhas no arquivo:

/etc/rsyslog.d/99-haproxy.conf
$AddUnixListenSocket /var/lib/haproxy/dev/log# Send HAProxy messages to a dedicated logfile:programname, startswith, "haproxy" { /var/log/haproxy.log stop}

A diretiva $AddUnixListenSocket diz ao Rsyslog para criar um socket de domínio Unix no local especificado, neste caso /var/lib/haproxy/dev/log. A secção :programname, startswith, "haproxy" especifica o ficheiro onde o Rsyslog irá escrever as entradas de log ao que recolhe do socket.

Após ter terminado a edição /etc/rsyslog.d/99-haproxy.conf, grave e feche o ficheiro premindo ESC, digitando :wq, e premindo ENTER.

Agora configurou o Rsyslog para ler as entradas de log do socket de domínio Unix em /var/lib/haproxy/dev/log e escreva-as num ficheiro de log em /var/log/haproxy.log.

No entanto, antes de reiniciar o Rsyslog você precisará determinar se o SELinux está reforçando o controle de acesso no seu sistema CentOS 8.

Para verificar a política atual do SELinux, execute o seguinte:

  • getenforce

Você receberá uma das seguintes saídas:

  • Enforcing – Neste modo, SELinux está reforçando o controle de acesso no seu sistema. Você precisará completar o seguinte Passo 4 opcional – Configurando a seção SELinux.
  • Permissive – Neste caso, o SELinux registra todas as tentativas de acesso ao seu arquivo de log, mas não impõe controles de acesso no seu sistema.
  • Disabled – Se o SELinux estiver desativado, então ele não está registrando ou impondo nenhuma política de controle de acesso no seu sistema.

Se o comando getenforce retornar ou Permissive ou Disabled, então você pode reiniciar o Rsyslog com o seguinte comando:

  • sudo systemctl restart rsyslog

Após reiniciar o Rsyslog, você será capaz de ver os logs no arquivo /var/log/haproxy.log que você configurou em /etc/rsyslog.d/99-haproxy.conf. Prossiga para o Passo 5 – Testando Logs HAProxy para ter certeza que tudo está funcionando como esperado.

Outra, se seu sistema está rodando SELinux no modo Enforcing, então a próxima seção deste tutorial explica como adicionar um módulo para permitir que Rsyslog e HAProxy se comuniquem um com o outro através de seu socket de domínio Unix compartilhado.

Passo 4 – (Opcional) Configurando SELinux

Se seu sistema CentOS 8 estiver configurado com SELinux no modo Enforcing, então você precisará permitir o acesso do Rsyslog ao diretório do HAProxy chroot. Permitir este acesso permitirá ao Rsyslog criar o socket de domínio Unix que o HAproxy enviará seus logs para.

Se você não está familiarizado com SELinux, esta série tutorial Uma Introdução ao SELinux no CentOS 7 irá ajudá-lo a aprender como gerenciar e interagir com SELinux. Embora seja escrito para o CentOS 7, os princípios e comandos da série são igualmente aplicáveis ao CentOS 8.

Para ativar o Rsyslog e o acesso HAProxy ao seu socket compartilhado, a primeira tarefa é criar um arquivo de política de Type Enforcement. Abra um novo ficheiro chamado rsyslog-haproxy.te em vi ou o seu editor preferido:

  • vi rsyslog-haproxy.te

Pressione i para mudar para o modo INSERT, depois cole as seguintes linhas no ficheiro:

rsyslog-haproxy.te
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 };

A primeira linha define o nome e a versão do módulo. A parte require informa ao carregador do módulo SELinux sobre os tipos e classes necessárias para que a política seja carregada como módulo. As duas últimas linhas são as regras que permitem o acesso do Rsyslog ao arquivo HAProxy chroot e socket respectivamente.

Quando terminar de editar o arquivo, salve e feche-o pressionando ESC, digitando :wq, e pressionando ENTER.

Next, execute o seguinte comando para instalar o pacote checkpolicy, que contém o utilitário checkmodule que irá utilizar para transformar o ficheiro Type Enforcement num módulo SELinux.

  • sudo dnf install checkpolicy

Agora que tenha a ferramenta checkmodule instalada, o próximo passo é compilar o módulo e depois carregá-lo no SELinux. Execute o seguinte para compilar o arquivo Type Enforcement em um módulo SELinux:

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

Next, execute semodule_package para gerar um pacote de política completo que o SELinux pode carregar no kernel Linux:

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

O passo final é carregar o pacote que você gerou no kernel Linux usando o comando semodule:

  • sudo semodule -i rsyslog-haproxy.pp

Adicionar o módulo pode levar alguns segundos. Assim que o comando estiver completo você pode confirmar que o módulo está carregado no kernel executando o comando semodule comando:

  • sudo semodule -l |grep rsyslog-haproxy

Você deve receber saída como o seguinte:

Output
rsyslog-haproxy

Após o módulo estar carregado você pode reiniciar o Rsyslog com o seguinte comando:

  • sudo systemctl restart rsyslog

Você agora definiu, compilou e carregou uma política SELinux que permitirá que o HAProxy e o Rsyslog se comuniquem através do seu socket compartilhado.

No próximo passo você irá testar que tudo funciona fazendo um pedido HTTP ao HAProxy e examinando o seu novo ficheiro de log.

Passo 5 – Testando o Log do HAProxy

Agora que você configurou o HAProxy, Rsyslog, e opcionalmente SELinux, você pode testar que o log para /var/log/haproxy.log está funcionando.

Por padrão o pacote haproxy é enviado com um arquivo de configuração que cria um socket de ouvinte HTTP na porta 5000. A configuração aponta para um servidor backend inexistente, portanto qualquer pedido para a porta resultará em um erro HTTP 503.

Para verificar um erro 503 no seu arquivo /var/log/haproxy.log, primeiro gere um pedido HTTP usando curl assim:

  • curl -si http://127.0.0.1:5000

Você deve receber uma saída como a seguinte:

Output
HTTP/1.0 503 Service UnavailableCache-Control: no-cacheConnection: closeContent-Type: text/html<html><body><h1>503 Service Unavailable</h1>No server is available to handle this request.</body></html>

>Agora examine /var/log/haproxy.log para qualquer resposta HTTP 503 usando o comando grep comando:

  • sudo grep -E 'NOSRV.+503' /var/log/haproxy.log

Nota: A parte NOSRV.+503 do comando é uma expressão regular. Este tutorial em Usando o Grep & Expressões regulares para procurar por padrões de texto no Linux
aprofunda o uso de grep e expressões regulares.

Você deve receber uma linha (ou múltiplas linhas) como a seguinte:

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

Esta linha corresponde ao pedido curl que você fez, o que significa que Rsyslog e HAProxy estão configurados para usar seu socket compartilhado corretamente.

Conclusão

Neste tutorial de início rápido, você configurou o HAProxy para logar em um socket de domínio Unix. Você também configurou o Rsyslog para criar e ler a partir do socket para que os dois programas possam se comunicar um com o outro sem abrir nenhuma porta TCP/IP no seu sistema. Finalmente, você opcionalmente compilou, empacotou e carregou uma política SELinux para permitir que o Rsyslog e o HAProxy tenham acesso compartilhado ao seu socket.

Deixe uma resposta

O seu endereço de email não será publicado.