2012年11月9日金曜日

NginxでELB対策(アクセスログにクライアントIP)

スズキです。

以前、下記のようにApacheでELB経由のアクセスログに、ELBのIPアドレスではなく
クライアントIPを出力する方法を紹介しました。
ApacheでREMOTE_ADDRをELB経由でも...(CentOS)
当然それは、Nginxでも同様なので、今回はNginxでの実現方法の紹介です。

といってもNginxにはHttpRealipModuleというモジュールが存在し、
それが利用できれば、すぐに実現できます。(Apache2.4なら"mod_remoteip"ですね)

ということで、まずは対象のNginxにHttpRealipModuleが組み込まれているか確認です。
(下記の出力で"--with-http_realip_module"があればOKです)
# nginx -V
nginx version: nginx/1.2.3
built by gcc 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
TLS SNI support enabled
configure arguments:
--user=nginx
--group=nginx
--prefix=/usr/share/nginx
--sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi
--pid-path=/var/run/nginx.pid
--lock-path=/var/lock/subsys/nginx
--with-http_ssl_module
--with-http_realip_module
--with-http_addition_module
--with-http_xslt_module
--with-http_image_filter_module
--with-http_geoip_module
--with-http_sub_module
--with-http_dav_module
--with-http_flv_module
--with-http_gzip_static_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_degradation_module
--with-http_stub_status_module
--with-http_perl_module
--with-mail
--with-file-aio
--with-mail_ssl_module
--with-ipv6
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
--with-ld-opt=-Wl,-E

組み込まれていることが確認できたら、下記のように設定ファイル(nginx.conf)に
追記します。
# For ELB
set_real_ip_from   10.0.0.0/8;
real_ip_header     X-Forwarded-For;

"ser_real_ip_from"はELBのIPアドレスです。普通のEC2なら"10.0.0.0/8"とし、
VPCなら、ELBが所属するサブネットのネットワークアドレスを指定します。

"real_ip_header"はクライアントIPが渡されるHTTPヘッダです。ELBの場合は、
X-Forwarded-Forを指定することになります。

最終的に"nginx.conf"は下記のようになるのでは、とおもいます。
http {
    ....
    # For ELB
    set_real_ip_from   10.0.0.0/8;
    real_ip_header     X-Forwarded-For;
    ...
}

最後にNginxを再起動してアクセスログを確認すると、リモートIPの部分が、ELBのもの
(10.0.0.0/8)から実際のクライアントのIPに変わっていることが確認できるはずです。

また、ブログ量が減ってる...
--------
http://www.suz-lab.com

0 コメント: