Eu montei esse script de vários lugares. O que eu espero é que ele faça o seguinte depois de executar:
- Pause todo o tráfego http "NOVO" para as portas 80 e 443 - apenas "pause", não dê nenhum erro
- reinicie o haproxy normalmente quando todas as solicitações "em andamento" forem concluídas
- Desative o tráfego http e continue os negócios como de costume.
É assim que vai funcionar? Perdi alguma coisa? Temos milhares de regras acl baseadas em ip, armazenadas em um arquivo que faz referência a haproxy e precisamos recarregá-lo várias vezes por minuto.
#!/bin/sh
# hold/pause new requests
iptables -I INPUT -p tcp --dport 80 --syn -j DROP
iptables -I INPUT -p tcp --dport 443 --syn -j DROP
sleep 1
# gracefully restart haproxy
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
# allow new requests to come in again
iptables -D INPUT -p tcp --dport 80 --syn -j DROP
iptables -D INPUT -p tcp --dport 443 --syn -j DROP
Edit: Eu adoraria testá-lo de alguma forma, mas ainda não temos tráfego (com exceção de eu testar).
Fontes:
http://www.forouzani.com/reload-haproxy-cfg-without-restarting.html