はじめに
くどうです。
Azureにはアクセスを負荷分散する方法として、Load BalancerとApplication Gatewayが用意されています。
しかし、それぞれレイヤー4とレイヤー7で挙動が異なりHTTPdへのアクセスログが異なります。
そこで、今回はアクセスログについて比較していきたいと思います。
用意した環境はCentOS上にApacheをデフォルトの状態(yum install httpd)したものです。
Load Balancer
実際にログを確認してみます。
168.63.129.16 - - [10/Aug/2016:08:15:58 +0000] "GET / HTTP/1.1" 200 5 "-" "Load Balancer Agent" 154 - - 168.63.129.16 - - [10/Aug/2016:08:16:03 +0000] "GET / HTTP/1.1" 200 5 "-" "Load Balancer Agent" 178 - - 168.63.129.16 - - [10/Aug/2016:08:16:08 +0000] "GET / HTTP/1.1" 200 5 "-" "Load Balancer Agent" 177 - - 168.63.129.16 - - [10/Aug/2016:08:16:13 +0000] "GET / HTTP/1.1" 200 5 "-" "Load Balancer Agent" 183 - - 210.227.234.114 - - [10/Aug/2016:08:16:13 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 220 - - 210.227.234.114 - - [10/Aug/2016:08:16:14 +0000] "GET /favicon.ico HTTP/1.1" 404 287 "http://13.78.48.179/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 241 - -
Load Balancerからの死活監視(プローブ)は「Load Balancer Agent」と表示されます。
通常の外部からのアクセスもIPアドレスなども問題なく表示されています。
ただし、Load Balancerからの死活監視のログが邪魔ですね。
/etc/httpd/conf/httpd.conf を以下のように設定し排除します。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined SetEnvIf User-Agent "Load Balancer Agent" nolog CustomLog logs/access_log combined env=!nolog
これで出力されなくなります。
Application Gateway
実際にログを確認してみます。
10.0.1.6 - - [10/Aug/2016:07:46:05 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 10.0.1.6 - - [10/Aug/2016:07:46:35 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 10.0.1.6 - - [10/Aug/2016:07:47:05 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 10.0.1.6 - - [10/Aug/2016:07:47:35 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 10.0.1.7 - - [10/Aug/2016:07:47:46 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 10.0.1.7 - - [10/Aug/2016:07:47:46 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 10.0.1.7 - - [10/Aug/2016:07:47:49 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 10.0.1.7 - - [10/Aug/2016:07:47:51 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
アクセス元は、すべてApplication Gatewayの内部アドレスになっていることが分かります。
これでは、アクセスログの解析には役立ちません。
これを解決する方法として、X-Forwarded-ForとX-Forwarded-Protoをログに残します。
これはAWS ELBとも同じです。
/etc/httpd/conf/httpd.conf を編集しています。
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" combined
実際にログを確認してみます。
10.0.1.6 - - [10/Aug/2016:07:53:35 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 426 - - 10.0.1.7 - - [10/Aug/2016:07:53:46 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 423 - - 10.0.1.6 - - [10/Aug/2016:07:54:05 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 892 - - 10.0.1.7 - - [10/Aug/2016:07:54:16 +0000] "GET / HTTP/1.1" 200 5 "-" "-" 406 - - 10.0.1.7 - - [10/Aug/2016:07:54:19 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 338 210.227.234.114:27756 http 10.0.1.7 - - [10/Aug/2016:07:54:21 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 299 210.227.234.114:27756 http 10.0.1.7 - - [10/Aug/2016:07:54:23 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 361 210.227.234.114:27756 http
末尾の方でX-Forwarded-ForとX-Forwarded-Protoが取得できていることが確認できます。
これで問題なく解析が行えるかと思います。
まとめ
アクセスを負荷分散するLoad BalancerとApplication Gatewayですが、それぞれ出力されるアクセスログも異なるため気を付けましょう。
また、対処する方法も異なるので気を付けましょう。これらはAzureに限ったことではありません。
X-Forwarded-ForとX-Forwarded-Protoが利用されるケースが多いので覚えておくとよいと思います。
ではでは