やってること
- HAProxy の option httpclose というオプションについて挙動を調べてみたわよ
- tcpdump と HTTP の HEAD メソッド使わったわ
そもそも option httpclose は何もの?
リクエスト毎にヘッダを解析して Connection: close が付与されていなければヘッダに付加してバックエンドにリクエストを投げるオプションみたい。ふーん…ちなみに似たようなオプションで option http-server-close というオプションもあるけど、これはクライアントとの接続は維持(Keep-Alive)しつつバックエンドとのサーバーの接続はクローズするような挙動みたいね。
試した環境
イメージこんな感じ。
Amazon の ELB でも挙動を見てみたわ。
挙動拳!(波動拳!)
HAProxy 配下のバックエンドサーバー側で以下のように tcpdump でリクエストを待ち構えてみたわ。
tcpdump -i eth0 port 80 -Xns 1000リクエストは HEAD メソッドよ。
HEAD /ahoaho.php HTTP/1.1 Host: example.com以下、option httpclose の有り、無しの違い。わかるかしら…。
option httpclose 無し

option httpclose 有り

ついでに option http-server-close でも…ということで、option http-server-close はバックエンド側で Connection: close を行いつつフロントエンドでは Keep-Alive を維持するというものなので、クライアントと HAProxy 間での option httpclose と option http-server-close で挙動の違いを見てみるわ。
option httpclose
option http-server-close

どうかしら、おばちゃまも試してみて初めて気付いたわ。option httpclose はガッツリクライアントととのコネクションを切っているのに対して option http-server-close は Connetion: close が無いの、わかるかしら。
あらやだ…
ちなみに、option http-server-close が有効な状態でフロントエンドとバックエンド間の通信を覗き見してみたわ。「家政婦は見た」のノリよ。
「あらやだ…」フロントエンド = HAProxy からバックエンドに対して Connection: close が投げられているわね。もちろん、バックエンドからのレスポンスにも Connection: close が付いているわね。
お・ま・け
ELB の配下にバックエンドサーバーをぶら下げて試してみたわ。
リクエストとレスポンス
Connection: keep-alive が返ってきているわ。
ELB とバックエンド間の通信
面白いのは ELB からバックエンドに対して Connection: keep-alive で投げていて、バックエンドからは Connection: close で返却しているにも関わらずクライアントのレスポンスには Connection: keep-alive が付与されているかしら…。
はあ…
おばちゃま、HTTP プロトコルは何にもしらないままこの業界で生きてきたけど、tcpdump と telnet さえあればこんなにも簡単にも動作確認が出来るなんて素晴らしいわね。勉強になってるわ。
元記事は、こちらです。