Estrutura:
2 vms com nginx e keepalived instalados
versão do kernel >= 5.15.27
rede 192.168.100.1/24
máquina master: .100.77 e máquina backup: 100.78
Ambos nginx como servidor web
keepalived como vrrp criando ip 192.168.100.80 escutando na porta 80
2 páginas web escutando na porta 6060 e 7070
Para o keepalived da máquina master:
Criei o arquivo keepalived.conf dentro de /etc/keepalived/
Apliquei a permissão 644 para o arquivo keepalived.conf
Apliquei as seguintes config nesse arquivo:
vrrp_instance keep1 {
state MASTER //keepalived principal
interface eth0 // ether que uso para rede
virtual_router_id 51 //referência do v
priority 101 //quanto maior o valor há maior preferência para deixar online
advert_int 2
authentication { //autenticação para grupos, todos devem ter as mesmas regras.
auth_type PASS
auth_pass 1234
}
virtual_ipaddress { //ip que o keepalived cria após ser ativado
192.168.100.80
}
}
virtual_server 192.168.100.80 80 { porta para o virtual server
delay_loop 5 //tempo de verificação dos servers
protocol TCP //protocolo de operação
lb_algo rr //forma de balanceamento
lb_kind DR //tipo de balanceador (direct routing nesse exemplo)
persistence_timeout 7200
real_server 192.168.100.77 80 {
weight 1 //importância desse servidor para enviar conexões
TCP_CHECK {
connect_timeout 5 //tempo para declarar falha no host
connect_port 80 //porta para teste
}
}
real_server 192.168.100.78 80 { //mesma config para outro servidor
weight 1
TCP_CHECK {
connect_timeout 5
connect_port 80
}
}
}
Para o keepalived da máquina backup:
modifico apenas duas partes da conf:
1.1 state MASTER -----> state BACKUP
1.2 priority 101 -----> priority 80
vrrp_instance keep1 {
state BACKUP //keepalived principal
interface eth0 // ether que uso para rede
virtual_router_id 51 //referência do v
priority 80 //quanto maior o valor há maior preferência para deixar online
advert_int 2
authentication { //autenticação para grupos, todos devem ter as mesmas regras.
auth_type PASS
auth_pass 1234
}
virtual_ipaddress { //ip que o keepalived cria após ser ativado
192.168.100.80
}
}
virtual_server 192.168.100.80 80 {ip + porta para o virtual server
delay_loop 5 //tempo de verificação dos servers
protocol TCP //protocolo de operação
lb_algo rr //forma de balanceamento
lb_kind DR //tipo de balanceador (direct routing nesse exemplo)
persistence_timeout 7200
real_server 192.168.100.77 80 {
weight 1 //importância desse servidor para enviar conexões
TCP_CHECK {
connect_timeout 5 //tempo para declarar falha no host
connect_port 80 //porta para teste
}
}
real_server 192.168.100.78 80 { //mesma config para outro servidor
weight 1
TCP_CHECK {
connect_timeout 5
connect_port 80
}
}
}
Pode confirmar se o ip virtual foi ativado com ip address. Na ether que foi configurada deve ter o ip da máquina mais o ip virtual criado pelo keepalived
Após isso só startar o keepalived com systemctl start keepalived, caso não utilize systemd escreva service keepalived start.
Para o Nginx:
Criei dois arquivos index.html em dois diretórios diferentes.
o primeiro: /var/www/example.com
o segundo: /var/www/example.net
Mantive usuário e grupo root para os diretórios e index.html
Utilizei o arquivo conf.d encontra em /etc/nginx/
e criei um arquivo example.com.conf contendo as seguintes config:
server {
listen 192.168.100.80:7070; //ip + porta da página web example.com
index index.html index.htm index.php;
server_name example.com; //nome do server
root /var/www/example.com; //caminho para o arquivo
}
server{ //mesma config, mas para a página example.net
listen 192.168.100.80:6060; //Note que mudei apenas a porta para acesso a outra página
index index.html index.htm index.php;
server_name example.net;
root /var/www/example.net;
}
Utilizei o diretório conf.d, porque está mapeado pelo arquivo nginx.conf como diretório válido para config de web server.
Por fim, basta start o nginx com systemctl start nginx e depois abrir o navegador e colocar o ip e porta da página.
Abaixo deixo alguma referências:
keepalived:
https://docs.oracle.com/cd/E37670_01/E41138/html/section_wkd_ys2_4r.html
https://www.pentestpartners.com/security-blog/how-to-use-keepalived-for-high-availability-and-load-balancing/
kernel:
https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.15.72/
nginx:
https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#virtual-server