title: nginx反向代理nginx,RealServer日志打印真实ip

date: 2016-05-11 19:15:37

tags:

nginx反向代理nginx,RealServer日志打印真实ip

听上去有点拗口,所以我先解释下

因为架构需要,我们在RealServer前面还部署了一个nginx服务器做反向代理,从标题可以可以看出来,RealServer的服务器也是nginx,这样做的好处就不多说了,缺点是默认情况下,RealServer的获取的请求IP全是前端那个nginx所在的主机的IP,这样既不方便我们做日志分析,也不方便我们在程序端对用户的行为进行处理,因此我们需要让RealServer获取的IP为真实用户的IP。

具体分两步说

第一步 RealServer获取用户IP

反向代理就不多说了,不清楚的可以看看我反向代理的博客 nginx负载均衡和反向代理实践

前端nginx配置

location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://xxx;
proxy_set_header X-Real-IP $remote_addr;
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;

由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址”。这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取$remote_addr),取得的是nginx的地址,即$remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的,但是,nginx是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下:

proxy_set_header            X-real-ip $remote_addr;

其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:

request.getAttribute("X-real-ip")

RealServer端

RealServer端相对麻烦一些,因为要用到nginx的一个模块 --with-http_realip_module 这个模块不用下载,属于nginx的内置模块,但是默认是不安装的,所以如果你已经装好了nginx,就需要你重新编译下nginx 加上这个参数

这个完成之后,然后开始配置nginx

# NginxHttpRealIpModule
set_real_ip_from 10.10.10.1; #可以单独IP
set_real_ip_from 10.10.10.1/24 #也可以写成网段
real_ip_header X-Forwarded-For;
real_ip_recursive on;

这个可以写在 http、server、location 里面 影响范围从大到小,根据你的需求决定

这一步完成之后,重载nginx

nginx -s reload

理论上程序已经可以通过real_ip_header拿到用户的真实IP了,但是日志打印的依然是代理服务器的IP,所以接着往下看

第二步,打印用户真实IP

重新定义日志格式

log_format main ‘$http_x_forwarded_for – $remote_user [$time_local] “$request”
‘‘$status $body_bytes_sent “$http_referer” ‘‘”$http_user_agent” $http_x_forwarded_for’; access_log /usr/local/nginx/logs/access.log main;

因为默认用的$remote_addr打印的是代理服务器的IP,我们不需要这个,所以我们使用代替了它的$http_x_forwarded_for 就可以打印出真实用户的IP了。

另外 这一步千万不要reload,这一步千万不要reload,这一步千万不要reload,这样日志不会往里面写的,kill -HUP 也不行,血淋淋的教训啊,老老实实的重启吧。

nginx反向代理nginx,RealServer日志打印真实ip的更多相关文章

  1. Nginx反向代理时tomcat日志获取真实IP

    对于nginx+tomcat这种架构,如果后端tomcat配置保持默认,那么tomcat的访问日志里,记录的就是前端nginx的IP地址,而不是真实的访问IP.因此,需要对nginx.tomcat做如 ...

  2. NGINX反向代理,后端服务器获取真实IP

    一般使用中间件做一个反向代理后,后端的web服务器是无法获取到真实的IP地址. 但是生产上,这又是不允许的,那么怎么解决? 1.在NGINX反向代理服务器上进行修改 2.修改后端web服务器配置文件 ...

  3. Nginx 反向代理时获取用户的真实 IP

    在平时我们开发后端程序的过程中,应该多多少少都会碰到记录客户端 IP 的场景,例如我之前写过的 APP 用户的一个审计功能,就需要获取用户的 IP 地址:还有广告系统里面,也是需要获取用户的 IP 地 ...

  4. Nginx反向代理+Tomcat+Springmvc获取用户访问ip

    Nginx+Tomcat+Springmvc获取用户访问ip 1.Nginx反向代理 修改Nginx配置文件 location / { ***********之前代码*******; proxy_se ...

  5. nginx 反向代理 Nginx 502 Bad Gateway

    查看错误日志: 摘要: nginx反向代理出现502错误 通过查看日志发现错误信息 2018/01/10 17:58:20 [crit] 8156#0: *1 connect() to 127.0.0 ...

  6. nginx反向代理后端web服务器记录客户端ip地址

    nginx在做反向代理的时候,后端的nginx web服务器log中记录的地址都是反向代理服务器的地址,无法查看客户端访问的真实ip. 在反向代理服务器的nginx.conf配置文件中进行配置. lo ...

  7. Nginx安装配置|Nginx反向代理|Nginx支持HTTPS|Nginx重定向

    Nginx安装配置 可以直接看到最下面的HTTPS. Nginx安装 我的系统如下: No LSB modules are available. Distributor ID: Ubuntu Desc ...

  8. nginx反向代理本地 单台wed -使用ip+端口代理

    环境: 本地外网ip:123.58.251.166 .配置index.html网页 [root@host---- conf.d]# cat /web/sing/index.html <h1> ...

  9. nginx - 反向代理 - 配置文件 header - 日志log格式

    server { listen ; server_name paas.service.consul; client_max_body_size 512m; access_log /data/bkdat ...

随机推荐

  1. 重复造轮子感悟 – XLinq性能提升心得

    曾经的两座大山 1.EF 刚接触linq那段时间,感觉这家伙好神奇,语法好优美,好厉害.后来经历了EF一些不如意的地方,就想去弥补,既然想弥补,就必须去了解原理.最开始甚至很长一段时间都搞不懂IQue ...

  2. C程序设计语言练习题1-21

    练习1-21 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变.假设制表符终止的位置与练习1-20的detab程序的情况相同.当使用一个制表符或者一个空格都可以打到 ...

  3. asp.net core VS goang web[修正篇]

    先前写过一篇文章:http://www.cnblogs.com/gengzhe/p/5557789.html,也是asp.net core和golang web的对比,热心的园友提出了几点问题,如下: ...

  4. MSSQL2005 导出excel文件

    Title:MSSQL2005 导出excel文件  --2011-01-16 16:01 EXEC master..xp_cmdshell 'bcp "select * from 数据库名 ...

  5. ural 1084 Goat in the Garden

    #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> u ...

  6. MySQL中的concat函数

    select concat('数据库',cast('aa' as char),'查询') as str

  7. 8051单片机I/O引脚工作原理

    一.P0端口的结构及工作原理 P0端口8位中的一位结构图见下图: 由上图可见,P0端口由锁存器.输入缓冲器.切换开关.一个与非门.一个与门及场效应管驱动电路构成.再看图的右边,标号为P0.X引脚的图标 ...

  8. Web前端开发

    由于互联网的各种兴起,网页开发似乎也火了,催生了github上各种js的轮子,各种重复,各种框架和库,什么Jquery,bootstrap等等.面对这么多框架和库我们在工程上该如何取舍(trade-o ...

  9. Android addView动态给Activity添加View组件

    本文主要讲述如何动态给UI界面添加布局和控件,在编程的时候很多时候需要动态显示一些内容,在动态添加View的时候,主要使用addView方法. 1. addView方法简介 在Android 中,可以 ...

  10. 总结:man, info, hwclock, cal, type, which, dirname, basename, who, which, whatis, makewhatis, hash, tty

    man, info, help, date, hwclock, cal, shutdown, reboot, halt, poweroff, type, cd, which, dirname, bas ...