🌏
CloudFront→ELB→EC2構成でNginxのaccess.log出力の為に調べたことなど
いろいろ設定したり調べたことをメモ。
1. x-forwarded-for に書き込まれる内容
CloudFront → ELB → EC2(Nginx)の場合、Nginx到達時のx-forwarded-for ヘッダには、クライアントとCloudFrontのEdgeサーバのIPアドレスがの2つが書き込まれる。
/etc/nginx/nginx.conf 抜粋(デフォルト)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
acccess.log
192.168.xxx.xxx - - [30/Jan/2022:07:09:18 +0000] "GET /favicon.ico HTTP/1.1" 404 3665 "https://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" "123.456.789.123, 987.654.321.987"
123.456.789.123 ・・・クライアントのIPアドレス
987.654.321.987 ・・・CloudFrontのEdgeサーバのIPアドレス
※例の為、ありえないIP
2. ELBからのヘルスチェックのaccess.logログを除去
/etc/nginx/nginx.conf(追加・変更部分)
map $http_user_agent $loggable {
~ELB-HealthChecker 0;
default 1;
}
access_log /var/log/nginx/access.log main if=$loggable;
3.CloudFront HTTP ヘッダーをaccess.logに含めたい
CloudFront HTTP ヘッダーが使える。アクセス元の国とかaccess.logに含めたい
/etc/nginx/nginx.conf(CloudFront HTTP ヘッダーの一部をログ出力するようにした例)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$http_cloudfront_viewer_country" '
'"$http_cloudfront_viewer_city" '
'"$http_cloudfront_viewer_postal_code"';
因みに、CloudFrontのビヘイビア(ELB)で、オリジンリクエストポリシーでマネージドの「AllViewer」を指定していたが、これではCloudFront HTTP ヘッダーはオリジンへ転送されなかったので、カスタムでオリジンリクエストポリシーを作成し、すべてのビューワーヘッダーとCloudFront ヘッダー(CloudFront-Viewer-Country、CloudFront-Viewer-City、CloudFront-Viewer-Postal-Code)を追加し、そのポリシーを利用するようにした。
acccess.log
192.168.xxx.xxx - - [30/Jan/2022:09:23:33 +0000] "GET /index.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" "123.456.789.123, 987.654.321.987" "JP" "Osaka" "540-0008"
4.accessログフォーマットのLTSV化)
便利そうなので、設定しようと考えている。(これはまだやっていない
5.その他
Ngnixの/etc/nginx/nginx.conf 変更時の反映方法
構文確認
sudo nginx -t
コンフィグ反映(再起動なし)
sudo nginx -s reload
Discussion