HAProxy закрыть внешнее соединение после N HTTP-запросов - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь настроить 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)

Я не в восторге от необходимости создания фиктивных заголовков, но, похоже, это работает.

...