java HTML5 nginx 程序员 Ubuntu Windows apache shell Firefox wordpress centos mysql google php Android 微软 开源 Python linux命令 linux

Nginx获取真实IP模块 http_realip_module

有这么一情况,某网站静态文件很多,而且用户访问的来源有网通,有电信,有铁通...设置还有国外。

为了令处于不同网络运营商的用户收取静态文件的速度都有良好的体现,该网站分别在这些不同运营商的积分中部署了squid,然后统一 Proxy 到主站的 Nginx 上,形成分布式缓存架构。

如果单是这样的话,主站上Nginx的日志,或者应用所获得的ip来源,始终都只会是各个机房中Squid的IP。而不是用户的真实IP。Apache的话,能通过以上所提到的mod_rpaf解决。当然,强大的Nginx也有自己的看家法宝。

Nginx有个在编译时默认不加载的模块http_realip_module,就是用来实现这一功能。但网上很多作者对这一模块的理解完全错误,以为是Proxy参数里头的proxy_set_header

proxy_set_header用于向后端转发IP head,这一参数是位于proxy_module模块中的,而并非http_realip_module。好多的博主写文章的时候,都把这模块的用途写成了“为后端应用提供 realip ”

Nginx官方wiki对于该模块的说明:http://wiki.nginx.org/NginxHttpRealIpModule

“It is useful if nginx works behind some proxy of L7 load balanver, and request come from local IP, but proxy add request header with client's IP.
This module isn't built by default, enable it with the configure option ”

说简单了,就是Nginx的http_realip_module等于Apache的mod_rpaf用于接受前端发来的IP head信息,从获取到真是的用户IP。

配置方式相当简单,重新编译Nginx加上--with-http_realip_module参数,如:

./configure --prefix=/opt/nginx --with-http_stub_status_module  --with-pcre=../pcre-6.6 --with-http_realip_module
make
make install

怎么?Nginx的服务正在跑着?要重启不容易?简单,原来你的Nginx装在哪,重新编译的时候就选哪,直接make install进去就会把原来的覆盖掉。然后执行killall -s USR2 nginx即可平滑升级。

编辑Nginx.conf

在 location 里头插入:

set_real_ip_from  192.168.1.0/24;    指定接收来自哪个前端发送的 IP head 可以是单个IP或者IP段
set_real_ip_from  192.168.2.1;  
real_ip_header    X-Real-IP;        IP head  的对应参数,默认即可。

配置跟mod_rpaf 大致相同!配置完成后sbin/nginx -t测试语法

测试无误执行Killall -s HUP nginx平滑加载配置。这么就无间断完成了Nginx这一模块的加载。

延伸阅读

评论