博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx反向代理nginx,RealServer日志打印真实ip
阅读量:4496 次
发布时间:2019-06-08

本文共 2133 字,大约阅读时间需要 7 分钟。


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配置

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

# NginxHttpRealIpModuleset_real_ip_from 10.10.10.1;    #可以单独IPset_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 也不行,血淋淋的教训啊,老老实实的重启吧。

转载于:https://www.cnblogs.com/colder219/p/5492537.html

你可能感兴趣的文章
Gym - 101670G Ice cream samples(CTU Open Contest 2017 尺取法)
查看>>
Configure Theano in Windows 8.1 x64
查看>>
win7下安装配置nodejs、使用npm安装express
查看>>
DB2某建表语句
查看>>
Android开发之Fragment的替换显示反复创建问题
查看>>
Hive修改表
查看>>
Sun JVM 内存模型及垃圾回收策略
查看>>
第3周实践项目7 删除链表元素最大值
查看>>
洛谷2408不同字串个数/SPOJ 694/705 (后缀数组SA)
查看>>
s12-day03-work01 python修改haproxy配置文件(初级版本)
查看>>
html5 聊天 宿舍 宿舍列表
查看>>
音乐的作曲形式
查看>>
matlab 各种文件的读取(及读写问题的解决)
查看>>
ie9下 “__flash__removeCallback”未定义
查看>>
Java虚拟机垃圾回收:基础点(转载)
查看>>
第五章项目----租房网
查看>>
CodeForces 834C The Meaningless Game (机智)
查看>>
深入分析 Java I/O 的工作机制(转)
查看>>
Python高级特性:迭代器和生成器 -转
查看>>
修炼编程的内功
查看>>