Apacheでモジュールを使わずにロードバランサからのアクセスと直接来たアクセスでログの出力形式を変える

# 概要

Apacheのデフォルトの設定では、ロードバランサから来たアクセスはクライアントでは無くロードバランサ(ここでは192.168.33.11)のIPが記録されてしまいます。

``` shell
### 例
================================================
192.168.33.11 - - [10/May/2017:17:59:34 +0900] "POST /_admin/login HTTP/1.1" 302 113 "http://10.136.3.182:8093/_admin/login" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
192.168.33.11 - - [10/May/2017:17:59:34 +0900] "GET /webmail/INBOX/mails/11 HTTP/1.1" 200 21856 "http://10.136.3.182:8093/_admin/login" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
192.168.33.11 - - [10/May/2017:17:59:38 +0900] "GET /webmail/INBOX/mails HTTP/1.1" 200 26867 "http://10.136.3.182:8093/webmail/INBOX/mails/11" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
================================================
```

LB経由のアクセスは「X-Forwarded-For」を出力するように設定すると各クライアント(ここでは172.17.0.[1-3])のIPが記録されるようになります。

``` shell
### 例
================================================
172.17.0.1 - - [10/May/2017:17:59:34 +0900] "POST /_admin/login HTTP/1.1" 302 113 "http://10.136.3.182:8093/_admin/login" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
172.17.0.2 - - [10/May/2017:17:59:34 +0900] "GET /webmail/INBOX/mails/11 HTTP/1.1" 200 21856 "http://10.136.3.182:8093/_admin/login" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
172.17.0.3 - - [10/May/2017:17:59:38 +0900] "GET /webmail/INBOX/mails HTTP/1.1" 200 26867 "http://10.136.3.182:8093/webmail/INBOX/mails/11" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
================================================
```

ただし、直接WebサーバにアクセスしたときはIPアドレスが記録されなくなってしまいます。

``` shell
### 例
================================================
- - - [10/May/2017:17:59:34 +0900] "POST /_admin/login HTTP/1.1" 302 113 "http://10.136.3.182:8093/_admin/login" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
- - - [10/May/2017:17:59:34 +0900] "GET /webmail/INBOX/mails/11 HTTP/1.1" 200 21856 "http://10.136.3.182:8093/_admin/login" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
- - - [10/May/2017:17:59:38 +0900] "GET /webmail/INBOX/mails HTTP/1.1" 200 26867 "http://10.136.3.182:8093/webmail/INBOX/mails/11" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
================================================
```

ここでは以下の設定について記載します

* ロードバランサ経由のアクセスはX-Forwarded-Forを出力
* 直接Webサーバに来たアクセスはクライアントのIPを出力
* さらに運用上必要のないログは出力しないようにする

変数名などは適当につけてますので適宜ふさわしい名前に変更してください。

# 設定

## ロードバランサ経由のアクセスと直接Webサーバに来たアクセスで分ける

* 単純にアクセス元のIPアドレスでログを分けています
    * ロードバランサのIPか、そうでは無いか

``` shell
...
<IfModule log_config_module>
...
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedlb
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
...
    # LB
    SetEnvIf Remote_Addr "192.168.33.11" lb_log

    # Direct
    SetEnvIf Remote_Addr "^(?!.*192\.168\.33\.11).+$" direct_log

    CustomLog "logs/access_log" combinedlb env=lb_log
    CustomLog "logs/direct_access_log" combined env=direct_log

</IfModule>
...
```

## さらに運用上必要のないログは出力しないようにする

静的ファイルなど、運用上特に必要のないログを出力しないようにします。(何が必要で何が必要でないかは用途によると思いますのでここの設定は参考としてください)

``` shell
...
<IfModule log_config_module>
...
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedlb
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
...
    # LB
    SetEnvIf Remote_Addr "192.168.33.11" lb_log
    SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(jpeg)|(css)|(ico)|(js)$" !lb_log

    # Direct
    SetEnvIf Remote_Addr "^(?!.*192\.168\.33\.11).+$" direct_log
    SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(jpeg)|(css)|(ico)|(js)$" !direct_log

    CustomLog "logs/access_log" combinedlb env=lb_log
    CustomLog "logs/direct_access_log" combined env=direct_log

</IfModule>
...
```

* Remote_AddrとRequest_URIの設定順を変えると効きません
    * 先にenv-variable(lb_log,direct_logなど)を決めておく必要がある
* CustomLogでenvを複数設定することはできない

# モジュールを使う場合

``` shell
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 192.168.33.11
RPAFheader X-Forwarded-For
```

* 運用上必要のないログの処理は省略
* 同じログファイルに両方(ロードバランサ経由、直接アクセス)書かれる