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

290人阅读 评论(0) 收藏 举报

http://www.jb51.net/article/53821.htm

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
location / {
  
# Forward the user's IP address to Rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
# proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
location / {
  
# Forward the user's IP address to Rails
proxy_set_header X-Real-IP $remote_addr;
# needed for HTTPS
# proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
# NginxHttpRealIpModule
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 192.168.2.1;
real_ip_header X-Real-IP;
}

最后记得 reload Nginx config

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

apache日志中默认有%h来指定来访客户端你的ip地址,但是使用了nginx代理上网则%h获得的ip地址会不准。
这就需要对nginx 和apache的配置文件设定 X-Forwarded-For 参数来获取客户端真实的ip地址。对于使用了反向代理的客户端,跟踪真实的ip地址。
/usr/nginx/conf/nginx.conf 添加以下参数:

1
2
3
4
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;

同时修改:

1
2
3
4
5
6
7
8
9
10
11
12
server {
   listen 80;
   server_name 域名 ;
   proxy_redirect off;
    location / {
     proxy_set_header  X-Forwarded-For $remote_addr;
     proxy_set_header  X-Forwarded-Host $server_name;
     proxy_set_header Host $host;
     proxy_pass http://域名;
   }
   access_log off;
 }

重启nginx使配置生效。
 
apache端需要安装一个第三方模块"mod_rpaf"了, 官方网站: http://stderr.net/apache/rpaf/

1
2
3
4
tar zxvf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/opt/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

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

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

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

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

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

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

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

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了。

查看评论

Nginx服务器配置

Nginx是由Igor Sysoev为俄罗斯的Rambler.ru站点开发的一个高性能的HTTP和反向代理服务器,也是现在中国互联网公司使用最多的代理软件,利用Nginx与各个模块的整合可以实现高效的WEB处理能力。官方QQ群:612148723。
  • 2017年01月01日 20:16

Nginx 作反向代理时将客户端ip传递给Tomcat

nginx.conf文件内location / { proxy_pass http://localhost:8080; proxy_set_header X-Real-IP $remo...
  • jb19900111
  • jb19900111
  • 2016-10-03 13:25:12
  • 2029

nginx设置反向代理,获取真实客户端ip

upstream这个模块提供一个简单方法来实现在轮询和客户端IP之间的后端服务器负荷平衡。 upstream abc.com { server 127.0.0.1:8080; ...
  • b1303110335
  • b1303110335
  • 2017-08-15 00:26:22
  • 1068

反向代理从nginx获取客户端IP实现

1.安装和配置nginx,这里不再多说,不会的请参考http://blog.csdn.net/zhaogangyyxf/article/details/793991292.在代理模块添加红色部份代码,...
  • zhaogangyyxf
  • zhaogangyyxf
  • 2018-02-28 15:01:26
  • 45

nginx做反向代理时,配置其让tomcat的日志获取客户端ip

在nginx的配置文件nginx.conf中配置,加上proxy_set_header X-real-IP $remote_addr。 server { liste...
  • farYang
  • farYang
  • 2016-12-24 23:18:58
  • 1948

nginx反向代理后获取不到客户端的真实ip地址

location / {    proxy_pass http://127.0.0.1:10678;    proxy_set_header Host $host; //加入下面配置...
  • gshzh00
  • gshzh00
  • 2017-09-04 17:37:32
  • 604

nginx反向代理后应用程序如何获取客户端真实IP?

Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的...
  • it_0101
  • it_0101
  • 2017-10-30 10:32:03
  • 1100

使用nginx反向代理后如何在后台web应用中获取用户ip

问题背景 在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.RemoteAddr就可以获取到客户端ip,但是当我们使用了ng...
  • wangkai_123456
  • wangkai_123456
  • 2017-05-01 15:02:44
  • 1222

IIS获取haproxy等反向代理后用户真实IP

http://www.yinxiulei.cn/iis-haproxy-ip.html haproxy配置 在配置中增加 option forwardfor #转发客户IP...
  • mituan1234567
  • mituan1234567
  • 2014-08-19 12:48:47
  • 1777

nginx多层代理获取客户端的真实ip

nginx多层代理获取客户端的真实ip 1、编译Nginx时,添加http_realip_module模块
  • wen_1108
  • wen_1108
  • 2017-10-24 16:59:18
  • 345
    个人资料
    等级:
    访问量: 1万+
    积分: 240
    排名: 31万+