このガイドでは、サードパーティのロードバランサーの前に Cloudflare を置く構成でよく起きる問題の切り分け方を説明します。
Cloudflare をリバースプロキシ(オレンジクラウド)として F5 BIG-IP ロードバランサーの前に置くと、Cloudflare が持続接続を維持する仕組みが原因で、セッションアフィニティの問題が起きることがあります。
F5 BIG-IP ロードバランサーは、通常、TCP 接続の開始時にセッション Cookie を設定します(未設定の場合)。その後、同じ TCP 接続上の後続 HTTP リクエストの Cookie は無視します。Cloudflare は HTTP keep-alive により、同じ TCP 接続で複数の HTTP セッションを送るため、セッションアフィニティが壊れます。
症状の例は次のとおりです。
- ログアウトされる、または認証フローで不具合が起きる。
- チェックアウト時にショッピングカートが空になる。
- セッションに依存するほかの不整合。
F5 のセッション Cookie の名前は任意ですが、次の形式になることが多いです。
-
暗号化なし(簡単にデコードでき、オリジンサーバーの IP とポートが分かります):
BIGipCookie=16908480.16415.0000;path=/; Httponly; Secure -
暗号化あり:
BIGipCookie=TS019a202c=01625f1893a7d6e4b2c1a0f98e7d6c5b4a3f2e1d; path=/; Httponly; Secure
curl で確認できます。リクエストを複数回実行し、セッション Cookie が一貫して付くかを見ます。
for i in {1..100}; do curl -sI https://example.com; done 2>&1 | grep "<COOKIE_NAME>" | wc -lCloudflare 経由では件数が 100 を大きく下回り、オリジンへ直接接続すると 100 になる場合、この問題が起きています。
推奨する対処は、F5 BIG-IP ロードバランサーで、単一ホスト(/32)マスクの F5 OneConnect プロファイルを設定することです。
- クライアントは TCP 接続でバックエンドサーバーに固定されません
- HTTP リクエストは個別に負荷分散されます
- 同じ TCP セッション内でも、異なるパーシステンス情報を持つ Cookie が尊重されます
- Cookie は HTTP レスポンスごとに設定されます
- OneConnect が、お使いの TMOS(Traffic Management OS)のバージョンと互換性があるかを確認します。
- F5 の動作が変わるため、先にステージングまたはテスト用の Virtual IP(VIP)で試します。
- Cloudflare と正しく動かすには、
/32マスクが必須です。