小知识:Nginx作为反向代理时传递客户端IP的设置方法

nginx默认配置文件里面是没有进行日志转发配置的,这个需要我们自己手动来操作了,当然后端的real server不同时操作方法是不一样的,这里我们分别例举几种情况来说明一下。

nginx做前端,转发日志到后端nginx服务器:

因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。

同样适用于前端是 Squid 或者其他反向代理的情况。

首先前端的 Nginx 要做转发客户端 IP 的配置:

01location / {
03
04# Forward the users IP address to Rails
05proxy_set_header X-Real-IP $remote_addr;
06# needed for HTTPS
07# proxy_set_header X_FORWARDED_PROTO https;
08proxy_set_header X-Forwarded-For $remote_addr;
09proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
10proxy_set_header Host $host;
11proxy_redirect off;
12}

后端的 Nginx 需要安装一个 Module: NginxHttpRealIpModule,编译的时候默认不包含此 Module,需要重新编译安装 Nginx,configure 的时候加上 –with-http_realip_module,Nginx 升级或者添加/删除 Module 时支持热切换,可以避免中断服务。

升级后配置 NginxHttpRealIpModule,set_real_ip_from 就是指前端 Nginx 或者 Squid 的 IP:

01location / {
03
04# Forward the users IP address to Rails
05proxy_set_header X-Real-IP $remote_addr;
06# needed for HTTPS
07# proxy_set_header X_FORWARDED_PROTO https;
08proxy_set_header X-Forwarded-For $remote_addr;
09proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
10proxy_set_header Host $host;
11proxy_redirect off;
12# NginxHttpRealIpModule
13set_real_ip_from 192.168.1.0/24;
14set_real_ip_from 192.168.2.1;
15real_ip_header X-Real-IP;
16}

最后记得 reload Nginx config

nginx做前端,转发日志到后端apache服务器:

apache日志中默认有%h来指定来访客户端你的ip地址,但是使用了nginx代理上网则%h获得的ip地址会不准。

这就需要对nginx 和apache的配置文件设定 X-Forwarded-For 参数来获取客户端真实的ip地址。对于使用了反向代理的客户端,跟踪真实的ip地址。

/usr/nginx/conf/nginx.conf 添加以下参数:
1proxy_set_header Host $host;
2proxy_set_header X-Forwarded-For $remote_addr;
3proxy_set_header X-Forwarded-Host $server_name;
4proxy_set_header X-Real-IP $remote_addr;

同时修改:

01server {
02listen 80;
03server_name 域名 ;
04proxy_redirect off;
05location / {
06proxy_set_header  X-Forwarded-For $remote_addr;
07proxy_set_header  X-Forwarded-Host $server_name;
08proxy_set_header Host $host;
09proxy_pass http://域名;
10}
11access_log off;
12}

重启nginx使配置生效。

apache端需要安装一个第三方模块”mod_rpaf“了, 官方网站: http://stderr.net/apache/rpaf/
2tar zxvf mod_rpaf-0.6.tar.gz
3cd mod_rpaf-0.6
4/opt/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

修改apache配置 /usr/apache2/conf/httpd.conf

1LoadModule rpaf_module modules/mod_rpaf-2.0.so
2RPAFenable On
3RPAFsethostname On
4RPAFproxy_ips ip地址  #Nginx所在服务器的IP
5RPAFheader X-Forwarded-For

重启apache 查看日志就可以看见日志中已经获得到真实ip了。

nginx做前端,转发日志到后端IIS服务器:

  iis 如果放在反向代理后面,日志里的ip是反向代理服务器的ip,不是真正用户的ip,想要记录用户的ip要做两件事。

1.在反向代理设置X-Forwarded-For段,以下为nginx下的配置示例:

1server
2{
3  location
4  {
5  ……
6  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
7  ……
8  }
9}

2.在iis站点上安装下面这个isapi filter,这东西是在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了。
声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Linux QT Kit丢失及Version为空问题解决方案

2023-5-8 4:33:17

建站知识

小知识:Linux read命令的使用

2023-5-8 4:41:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索