Haproxy

haproxy:如何在不啟動應用程序會話的情況下準備伺服器維護?

  • May 20, 2021

問題

我正在使用 haproxy 對 Web 伺服器進行負載平衡。我使用帶有附加 cookie 的會話持久性,因為某些應用程序使用會話文件,並且這些文件在伺服器之間不同步。

我想禁用伺服器進行維護,但不中斷會話。所以我想允許現有客戶繼續他們的應用程序會話,但不接受新客戶。

代理行為

  • 我將伺服器設置為“進行維護”
  • 如果客戶端設置了 cookie,即使標記為“進入維護”,也要使用伺服器
  • 如果一個新的客戶端(沒有 cookie)來了,它會被定向到另一個伺服器
  • 在所有客戶端結束他們的應用程序會話之後,沒有更多的客戶端會將 cookie 設置到這個特定的伺服器,我最好在不中斷使用者的情況下關閉它。

你認為這可以通過一些 haproxy 配置來實現嗎?或者有什麼聰明的方法嗎?

其他方法

實現此需求的其他方法的非詳盡列表:

  • 在伺服器之間同步會話文件(需要一種在多個伺服器之間同步文件的方法,或者一個通用的單個掛載點)
  • 使用數據庫儲存會話資訊(需要更改應用程序行為)

更多細節

我使用這種配置:

frontend https-in
  bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
  reqadd X-Forwarded-Proto:\ https

  acl APP1 hdr(host) -i APP1.atac.local
  use_backend APP1 if APP1

  default_backend _default

backend APP1
  redirect scheme https if !{ ssl_fc }
  mode http
  balance roundrobin
  cookie HAPROXY_SESSION insert indirect
  option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
  server SRV1 SRV1_IP:PORT cookie SRV1 check
  server SRV2 SRV2_IP:PORT cookie SRV2 check

如果我只是禁用 SRV1(使用 haproxy cli 命令),我認為在 SRV1 上打開的所有應用程序會話都會在目前 HTTP“會話”結束後中斷。是對的嗎?

使用 Web 管理界面將伺服器置於排水模式。這提供了您正在尋找的確切功能。

有關 Web 管理界面的詳細資訊 - https://github.com/Aidaho12/haproxy-wi

如果您使用socat與您的 haproxy 配置進行通信,您可以通過以下方式將伺服器置於耗盡狀態:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

更多命令在這裡!要在 Ubuntu 中安裝 socat,請訪問此答案

我用 haproxy 1.6.3 版本進行測試:)

引用自:https://serverfault.com/questions/705991