ども、cloudpack の かっぱ(@inokara)です。
久しぶりに HAProxy を触る機会があったのでメモ。HTTP リクエストの Host ヘッダの情報を元にバックエンドを振り分けてみます。あと、HAProxy とは無関係ですが Nginx で SSL のプロトコルをアクセスログに記録出来るのでメモ。
frontend kappa-test bind 0.0.0.0:80 acl hage hdr(host) -i hage.test.inokara.com acl pika hdr(host) -i pika.test.inokara.com use_backend hage_bk if hage use_backend pika_bk if pika default_backend hage_bk
ポイントは
acl hage hdr(host) -i hage.test.inokara.com
HAProxy では acl ディレクティブにてアクセスコントロールを定義することが出来ます。その後に acl の定義名として hage を指定します。
そして、その後に続く hdr(host) が今回の核となります。hdr はリクエストヘッダを意味しており、幾つかのオプション(ヘッダの項目)がありますが、今回は host と定義してリクエストヘッダ内のホストヘッダをチェックの対象とします。また、-i オプションで hdr(host) の文字列を指定しています。
ざっくり処理の流れとしては…
となります。
backend の設定はなんの変哲もありません。
backend hage_bk
server hage 127.0.0.1:8001 check
backend pika_bk
server pika 127.0.0.1:8002 check
% curl http://hage.test.inokara.com/ hage % curl http://pika.test.inokara.com/ pika
ちゃんとリクエストの URL 毎にバックエンドが振り分けられていることがわかります。
ネットを徘徊していたら… Nginx は HTTPS でのリクエストから SSL プロトコルや Cipher をアクセスログに記録出来るようなので試してみました。
以下は nginx.conf の抜粋です。
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'$ssl_protocol/$ssl_cipher'
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
log_format に '$ssl_protocol/$ssl_cipher' を追加するだけです。
以下のように二つの URL にアクセスしてみます。
% curl -k https://hage.test.inokara.com/<br /> % curl -k https://xxx.xxx.xxx.xxx:444/
前者は ELB に SSL ターミネートさせている URL で後者はターミネートされている実際の Web サーバーとなります。
${ELP_IP} - - [05/Nov/2014:16:07:51 +0000] "GET / HTTP/1.1" 200 5 "-" TLSv1.2/DHE-RSA-AES256-GCM-SHA384"curl/7.30.0" "zzz.zzz.zzz.zzz"
上記は ELB 経由でアクセスした際のログです。
zzz.zzz.zzz.zzz - - [05/Nov/2014:16:08:18 +0000] "GET / HTTP/1.1" 200 5 "-" TLSv1.2/ECDHE-RSA-AES256-SHA384"curl/7.30.0" "-"
上記は直接 Web サーバーにアクセスした際のログです。
ご覧のように微妙に記録されている Cipher が異なることから多段な Proxy の場合には実際のクライアントからの情報ではなく直前の情報のみが記録されるようです。
久しぶりの HAProxy を触りましたが豊富な機能に改めて驚かされたのと、最新のバージョンが 1.5.8 になっていて更にビビリました…。あと、Nginx の SSL 関連の情報がログに記録出来るのは感動しちゃいました。
ということで、おやすみなさい。
元記事はこちらです。
「HAProxy の HTTP リクエストホストヘッダによる振り分けと Nginx の SSL プロトコルや Cihper をアクセスログに記録する」