問題
haproxyを使用してWebサーバーの負荷を分散しています。一部のアプリケーションはセッションファイルを使用しますが、これらはサーバー間で同期されないため、セッションパーシステンスと追加のCookieを使用します。
セッションを中断することなく、メンテナンスのためにサーバーを無効にします。したがって、既存のクライアントがアプリケーションセッションを継続できるようにしたいのですが、新しいクライアントは受け入れません。
haproxyの動作
- サーバーを「メンテナンス中」に設定しました
- クライアントに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
(haproxy cliコマンドを使用して)SRV1を無効にした場合、SRV1で開かれたすべてのアプリケーションセッションは、現在のHTTP「セッション」の終了後に中断すると思います。そうですか?