Я пытаюсь настроить HAProxy для закрытия клиентского TCP-соединения после того, как оно было использовано для обработки N запросов.Моя цель состоит в том, чтобы наши долгоживущие клиенты периодически восстанавливали соединения, которые в противном случае поддерживаются HTTP Keep-Alive.
В основном я пытаюсь реализовать эквивалент keepalive_requests nginx (http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_requests).
В настоящее время у меня есть что-то вроде:
frontend https-in
bind *:443 ssl crt /etc/ssl/private/cert.pem
stick-table type binary len 32 size 1000 expire 75s store gpc0
acl close_connection sc0_get_gpc0 gt 3
acl exceeded_connection sc0_get_gpc0 gt 4
http-response set-header Connection Keep-Alive unless close_connection
http-response set-header Keep-Alive timeout=75\ max=3 unless close_connection
http-response set-header Connection Close if close_connection
timeout http-keep-alive 75s
timeout client 75s
tcp-request content track-sc0 ssl_fc_session_id
tcp-request content reject if exceeded_connection
http-request sc-inc-gpc0
default_backend https
backend https
option httpchk GET /health
server localhost 127.0.0.1:8080 maxconn 1000
Но некоторые проблемы с этим включают в себя:
- Идентификатор сеанса SSL может повторно использоваться через соединения
- Это заканчивается внезапным закрытием соединения с клиентом, когда они превысили порог (при условии, что они игнорируют
Connection: Close
)
Есть ли рекомендуемые подходы для чего-то подобного? В идеале я бынапример:
- Отслеживать счетчик на основе отдельного TCP-соединения (не
src
, чтобы избежать случая, когда для одного и того же IP установлено несколько соединений) - Закрыть соединение на конечномответ (в то же время я отправляю
Connection: Close
)
Но я не смог отследить способы сделать что-либо из этого.
Спасибо!
Редактировать
Мне удалось разработать лучший способ отслеживания уникальных TCP-соединений, создав хеширование кортежа src, src_port, dst, dst_port:
http-request set-header X-Unique-Id %[src]:%[src_port]:%[dst]:%[dst_port]
http-request set-header X-Unique-Id-SHA %[req.fhdr(X-Unique-Id),sha1]
http-request track-sc0 req.fhdr(X-Unique-Id-SHA)
Я не в восторге от необходимости создания фиктивных заголовков, но, похоже, это работает.