Nginx作为反向代理时传递客户端IP的设置方法
nginx默认配置文件里面是没有进行日志转发配置的,这个需要我们自己手动来操作了,当然后端的realserver不同时操作方法是不一样的,这里我们分别例举几种情况来说明一下。
nginx做前端,转发日志到后端nginx服务器:
因为架构的需要采用多级Nginx反向代理,但是后端的程序获取到的客户端IP都是前端Nginx的IP,问题的根源在于后端的Nginx在HTTPHeader中取客户端IP时没有取对正确的值。
同样适用于前端是Squid或者其他反向代理的情况。
首先前端的Nginx要做转发客户端IP的配置:
location/{ proxy_passhttp://localhost:8000; #Forwardtheuser'sIPaddresstoRails proxy_set_headerX-Real-IP$remote_addr; #neededforHTTPS #proxy_set_headerX_FORWARDED_PROTOhttps; proxy_set_headerX-Forwarded-For$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerHost$host; proxy_redirectoff; }
后端的Nginx需要安装一个Module:NginxHttpRealIpModule,编译的时候默认不包含此Module,需要重新编译安装Nginx,configure的时候加上–with-http_realip_module,Nginx升级或者添加/删除Module时支持热切换,可以避免中断服务。
升级后配置NginxHttpRealIpModule,set_real_ip_from就是指前端Nginx或者Squid的IP:
location/{ proxy_passhttp://localhost:8000; #Forwardtheuser'sIPaddresstoRails proxy_set_headerX-Real-IP$remote_addr; #neededforHTTPS #proxy_set_headerX_FORWARDED_PROTOhttps; proxy_set_headerX-Forwarded-For$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerHost$host; proxy_redirectoff; #NginxHttpRealIpModule set_real_ip_from192.168.1.0/24; set_real_ip_from192.168.2.1; real_ip_headerX-Real-IP; }
最后记得reloadNginxconfig
nginx做前端,转发日志到后端apache服务器:
apache日志中默认有%h来指定来访客户端你的ip地址,但是使用了nginx代理上网则%h获得的ip地址会不准。
这就需要对nginx和apache的配置文件设定X-Forwarded-For参数来获取客户端真实的ip地址。对于使用了反向代理的客户端,跟踪真实的ip地址。
/usr/nginx/conf/nginx.conf添加以下参数:
proxy_set_headerHost$host; proxy_set_headerX-Forwarded-For$remote_addr; proxy_set_headerX-Forwarded-Host$server_name; proxy_set_headerX-Real-IP$remote_addr;
同时修改:
server{ listen80; server_name域名; proxy_redirectoff; location/{ proxy_set_headerX-Forwarded-For$remote_addr; proxy_set_headerX-Forwarded-Host$server_name; proxy_set_headerHost$host; proxy_passhttp://域名; } access_logoff; }
重启nginx使配置生效。
apache端需要安装一个第三方模块"mod_rpaf"了,官方网站:http://stderr.net/apache/rpaf/
wgethttp://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz tarzxvfmod_rpaf-0.6.tar.gz cdmod_rpaf-0.6 /opt/apache/bin/apxs-i-c-nmod_rpaf-2.0.somod_rpaf-2.0.c
修改apache配置/usr/apache2/conf/httpd.conf
LoadModulerpaf_modulemodules/mod_rpaf-2.0.so RPAFenableOn RPAFsethostnameOn RPAFproxy_ipsip地址#Nginx所在服务器的IP RPAFheaderX-Forwarded-For
重启apache查看日志就可以看见日志中已经获得到真实ip了。
nginx做前端,转发日志到后端IIS服务器:
iis如果放在反向代理后面,日志里的ip是反向代理服务器的ip,不是真正用户的ip,想要记录用户的ip要做两件事。
1.在反向代理设置X-Forwarded-For段,以下为nginx下的配置示例:
server { location { …… proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; …… } }
2.在iis站点上安装下面这个isapifilter,这东西是在f5的开发论坛上找到的,按开发者的话说,是为了解决iis放在f5后记录不到用户ip的问题,-_-#管他前端是f5还是nginx还是squid还是haproxy。都可以用。应该不错。装完之后重启下iis就搞定了。
http://devcentral.f5.com/weblogs/Joe/archive/2009/08/19/x_forwarded_for_log_filter_for_windows_servers.aspx
回头看下iis的日志,里面的ip已经是用户的真实ip了。