Haproxy
haproxy:如何在不啟動應用程序會話的情況下準備伺服器維護?
問題
我正在使用 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 版本進行測試:)