どうも、小ネタのおばちゃま(@inokara)よ。

やってること

  • HAProxy の option httpclose というオプションについて挙動を調べてみたわよ
  • tcpdump と HTTP の HEAD メソッド使わったわ

そもそも option httpclose は何もの?

リクエスト毎にヘッダを解析して Connection: close が付与されていなければヘッダに付加してバックエンドにリクエストを投げるオプションみたい。ふーん…ちなみに似たようなオプションで option http-server-close というオプションもあるけど、これはクライアントとの接続は維持(Keep-Alive)しつつバックエンドとのサーバーの接続はクローズするような挙動みたいね。

試した環境

イメージこんな感じ。

20140808_haproxy_001_haproxy-image

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 無し

20140808_haproxy_002_tcpdump-option-httpclose-disable

option httpclose 有り

20140808_haproxy_003_tcpdump-option-httpclose-enable

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

option httpclose

20140808_haproxy_004_tcpdump-option-httpclose-connection-close

option http-server-close

20140808_haproxy_005_tcpdump-option-http-server-close

どうかしら、おばちゃまも試してみて初めて気付いたわ。option httpclose はガッツリクライアントととのコネクションを切っているのに対して option http-server-close は Connetion: close が無いの、わかるかしら。

あらやだ…

ちなみに、option http-server-close が有効な状態でフロントエンドとバックエンド間の通信を覗き見してみたわ。「家政婦は見た」のノリよ。

20140808_haproxy_006_tcpdump-option-http-server-close-frontend-backend

「あらやだ…」フロントエンド = HAProxy からバックエンドに対して Connection: close が投げられているわね。もちろん、バックエンドからのレスポンスにも Connection: close が付いているわね。

お・ま・け

ELB の配下にバックエンドサーバーをぶら下げて試してみたわ。

リクエストとレスポンス

20140808_haproxy_007_tcpdump-request-response

Connection: keep-alive が返ってきているわ。

ELB とバックエンド間の通信

20140808_haproxy_008_elb-backend

面白いのは ELB からバックエンドに対して Connection: keep-alive で投げていて、バックエンドからは Connection: close で返却しているにも関わらずクライアントのレスポンスには Connection: keep-alive が付与されているかしら…。

はあ…

おばちゃま、HTTP プロトコルは何にもしらないままこの業界で生きてきたけど、tcpdump と telnet さえあればこんなにも簡単にも動作確認が出来るなんて素晴らしいわね。勉強になってるわ。

元記事は、こちらです。