share facebook facebook2 twitter menu hatena pocket slack

2014.11.17 MON

HAProxy の HTTP リクエストホストヘッダによる振り分けと Nginx の SSL プロトコルや Cipher をアクセスログに記録する

川原 洋平

WRITTEN BY川原 洋平

ども、cloudpackかっぱ@inokara)です。

はじめに

久しぶりに HAProxy を触る機会があったのでメモ。HTTP リクエストの Host ヘッダの情報を元にバックエンドを振り分けてみます。あと、HAProxy とは無関係ですが Nginx で SSL のプロトコルをアクセスログに記録出来るのでメモ。


参考


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) の文字列を指定しています。

ざっくり処理の流れとしては…

  1. リクエスト
  2. リクエストヘッダの Host をチェック
  3. hage.test.inokara.com ならば hage_bk に振り分け
  4. pika.test.inokara.com ならば pika_bk に振り分け
  5. 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/<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 をアクセスログに記録する