web-dev-qa-db-ja.com

HAproxy 1.5.8 Cookieベースのスティッキを設定するにはどうすればよいですか?

このアプリケーションではcookieベースのスティッキーセッションが必要なので、HAproxyを使用して、IISサーバーのファームへの着信トラフィックのバランスをとります。

ラボで機能しているように見える次の構成を使用していますが(ラウンドロビンは正常に動作し、セッションは保持されます)、3Kを超える同時ユーザーでプロダクションに適用すると失敗します。

フロントエンドFront_http

bind :80
mode http
default_backend backend_http
stats enable
capture cookie ASP.NET_SessionId len 32
maxconn 10000

フロントエンドFront_https

mode http
default_backend backend_https
bind *:443 ssl crt /etc/haproxy/cert.pem 
capture cookie ASP.NET_SessionId len 32
maxconn 10000

バックエンドbackend_http

 balance roundrobin
 option forwardfor
 stick-table type ip size 20k expire 5m
 appsession ASP.NET_SessionId len 64 timeout 5m request-learn prefix
 server Server_1 192.168.10.81:80 cookie Server_1
 server Server_2 192.168.10.81:80 cookie Server_2
 server Server_3 192.168.10.81:80 cookie Server_3

バックエンドbackend_https

 balance roundrobin
 option forwardfor
 stick-table type ip size 20k expire 5m
 appsession ASP.NET_SessionId len 64 timeout 5m request-learn prefix
 server Server_1 192.168.10.81:80 cookie Server_1 ssl verify none
 server Server_2 192.168.10.81:80 cookie Server_2 ssl verify none
 server Server_3 192.168.10.81:80 cookie Server_3 ssl verify none
 http-request set-header X-Forwarded-Port %[dst_port]
 http-request add-header X-Forwarded-Proto https if { ssl_fc }

HAProxy 1.5.8ドキュメントから、「appsession」コマンドでCookieベースのスティッキ性が実現されることを理解していますが、「Capture Cookie」や「stick-table」など、他のコマンドが果たす役割は理解できません。 appsessionを使用していますか?誰もが私がそれらがどのように機能するかを理解するのを助けて、あなたが私たちの設定で何か問題を検出した場合に助言できますか?.

9
Vanessa Bullock

まず、「機能しない」とは何か、または現在の構成で直面している問題について説明してください。

現在の構成にはいくつかの問題があります:-appsession sticknessはリロードに抵抗しません。これは、HAProxyをリロードするたびに粘着性が失われることを意味します。SSLトラフィックをポート80に転送しているため、SSLバックエンドにタイプミスがある可能性があります。これは、クリアHTTPに使用したポートと同じです。

HAProxyは、Cookieベースの永続化を行う多くの方法を許可します。

  • cookieの挿入:HAProxyはそれ自体にcookieを設定します。

    backend mybk
      [...]
      cookie SERVERID insert indirect nocache
      [...]
      server s1 10.0.0.1:80 check cookie s1
      server s2 10.0.0.2:80 check cookie s2
    
  • cookie接頭辞:HAProxyは既存のcookieを使用し(通常はアプリケーション1)、その値の前にサーバー名を付けます。

    backend mybk
      [...]
      cookie ASP.NET_SessionId prefix nocache
      [...]
      server s1 10.0.0.1:80 check cookie s1
      server s2 10.0.0.2:80 check cookie s2
    
  • スティックテーブル:HAProxyは、アプリケーションCookieを変更せずに学習して使用します。

    backend mybk
      [...]
      stick-table type string len 64 size 100k expire 15m
      stick store-response res.cookie(ASP.NET_SessionId)
      stick match req.cookie(ASP.NET_SessionId)
      [...]
      server s1 10.0.0.1:80 check 
      server s2 10.0.0.2:80 check
    

注:ピアセクションを使用して、2つのHAProxy間でデータの同期を維持し、構成を再読み込みする必要があります注2:有効期限パラメーターはアプリケーションのCookieタイムアウトと一致する必要があります

最後に重要なことですが、HAProxyは、ログベースのCookieベースの永続性に関するフラグ(cookieキーワードで理解できるもの)を報告します。そうすれば、リクエストのステータス(Cookieがあったか、有効だったかなど)とHAProxyが実行したアクション(新しいCookieを挿入するなど)がわかります。

HAProxyの詳細については、このブログページをご覧ください。 http://blog.haproxy.com/2012/03/29/load-balancing-affinity-persistence-sticky-sessions-what-あなたが知る必要がある/

バプティスト

24
Baptiste