Я собрал этот сценарий из разных мест. Я надеюсь, что после запуска будет выполнено следующее:
- Приостановите весь «НОВЫЙ» http-трафик для портов 80 и 443 - просто «приостановите» их, не выдавайте ошибок
- изящно перезапустите haproxy, когда все запросы «в процессе» будут выполнены
- Отключите http-трафик и продолжайте работать как обычно.
Это так будет работать? Я что-то пропустил? У нас есть тысячи правил acl, основанных на ip, которые хранятся в файле с ссылками на haproxy, и мы должны перезагружать его несколько раз в минуту.
#!/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
Изменить: Я хотел бы как-то проверить это, но у нас пока нет трафика (за исключением моего тестирования).
Источники:
http://www.forouzani.com/reload-haproxy-cfg-without-restarting.html