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:
OutputCreated 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:
. . .# 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:
. . .# 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:
$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:
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:
Outputrsyslog-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:
OutputHTTP/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:
OutputSep 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.