ども、cloudpack の かっぱ(@inokara)です。
はじめに
久しぶりに HAProxy を触る機会があったのでメモ。HTTP リクエストの Host ヘッダの情報を元にバックエンドを振り分けてみます。あと、HAProxy とは無関係ですが Nginx で SSL のプロトコルをアクセスログに記録出来るのでメモ。
参考
- HAProxy Document
- 俺らの suz-lab さんの記事→(ELBとからめて)Hostヘッダでの振り分けをHAProxyでやってみる | cloudpack.media
- How can I let nginx log the used SSL/TLS protocol and ciphersuite?
Host ヘッダによるバックエンド振り分け
frontend の設定
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)
の文字列を指定しています。
ざっくり処理の流れとしては…
- リクエスト
- リクエストヘッダの Host をチェック
- hage.test.inokara.com ならば hage_bk に振り分け
- pika.test.inokara.com ならば pika_bk に振り分け
- hage or pika 以外であれば hage_bk に振り分け
となります。
backend の設定
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 の SSL プロトコルログをアクセスログに記録する
なんとなく
ネットを徘徊していたら… 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/
% 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 をアクセスログに記録する」