--with-http_realip_module选项(后台Nginx服务器记录原始客户端的IP地址 )
转自:http://blog.itpub.net/27043155/viewspace-734234/
通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如,X-Real-IP 或 X-Forwarded-For)。
如果Nginx工作在某些7层负载均衡代理后面,这个功能对于Nginx服务器非常有用,由于客户端请求的本地IP(就是客户端的请求地址)在通过7层代理时被添加了客户端IP地址头,因此才使得后端的Nginx能够取得震慑客户端的IP地址值。该模块在默认安装是并没有安装,因此如果要使用该模块,那么在编译安装是需要添加--with-http_realip_module选项。
为什么使用该模块,它的意义在于能够使得后台服务器记录原始客户端的IP地址。
配置示例
|
set_real_ip_from 192.168.1.0/24; set_real_ip_from 192.168.2.1; real_ip_header X-Real-IP; |
指 令
该模块仅提供了两条指令。
指令名称:set_real_ip_from
功 能:通过该指令指定信任的地址,将会被替代为精确的IP地址。从0.8.22版本后也可以使用信任的Unix套接字。这里设置的IP就是指前端Nginx 、Varnish或者 Squid 的 IP地址。
语 法: set_real_ip_from [the address|CIDR|"unix:"]
默 认 值: none
使用环境: http, server, location
指令名称:real_ip_header
功 能:这个指令用于设置使用哪个头来替换IP地址。如果使用了X-Forwarded-For,那么该模块将会使用X-Forwarded-For头中的最后一个IP地址来替换前端代理的IP地址。
语 法: real_ip_header [X-Real-IP|X-Forwarded-For]
默 认 值: real_ip_header X-Real-IP
使用环境: http, server, location
使用实例
在下面的实例中,我们环境是这样的有两台Nginx服务器,一台是前端,另一台是后端,前端的Nginx被用作代理,而后台的Nginx用于提供页面访问,还有一台客户端,IP地址如下:
前端Nginx:192.168.7.10
后端Nginx:192.168.1.15
客户端主机:218.239.201.36
前端的Nginx配置是这样的:
|
server { listen 80; server_name www.xx.com; location / { root html; index index.html index.htm; charset utf-8; } location /865 { proxy_pass http://192.168.3.139:80/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; } …… } |
后端的Nginx配置如下:
|
server { listen 80; server_name localhost; location / { root /var/www/html; index index.html index.htm; } |
访问测试
如果我们访问http://www.xx.com/865,没问题,可以是正常访问,访问日志如下:
前端Nginx的日志:
|
218.239.201.36 - - [30/Aug/2011:16:09:56 +0800] "GET /865/ HTTP/1.1" 200 151 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1" |
后端Nginx的日志:
|
192.168.7.10 - - [30/Aug/2011:16:09:56 +0800] "GET // HTTP/1.0" 200 151 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1" |
我们看到在后端Nginx的日志中并没有记录原始客户端的IP地址,而是记录了前端Nginx的IP地址。
如果将后台Nginx服务器的配置修改为:
|
server { listen 80; server_name localhost; set_real_ip_from 192.168.3.0/24; set_real_ip_from 100.100.0.0/16; real_ip_header X-Real-IP; location / { root html; index index.html index.htm; } …… } |
然后我们再次进行访问测试:
前端Nginx的日志:
|
218.239.201.36 - - [30/Aug/2011:16:10:28 +0800 "GET /865/ HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1" |
后端Nginx的日志:
|
218.239.201.36 - - [30/Aug/2011:16:10:28 +0800] "GET // HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1" |
可见,这次后台记录的是客户端的IP地址。
--with-http_realip_module选项(后台Nginx服务器记录原始客户端的IP地址 )的更多相关文章
- java nginx等代理或网关转发请求后获取客户端的ip地址,原理
在没有网关或者反向代理软件情况下,java里获取客户端ip地址的方法是request.getRemoteAddr() 先解释下http协议和TCP协议: 网页默认是进行http连接了,http协议即超 ...
- 【Nginx】如何获取客户端真实IP、域名、协议、端口?看这一篇就够了!
写在前面 Nginx最为最受欢迎的反向代理和负载均衡服务器,被广泛的应用于互联网项目中.这不仅仅是因为Nginx本身比较轻量,更多的是得益于Nginx的高性能特性,以及支持插件化开发,为此,很多开发者 ...
- haproxy 让后端服务器记录用户的真是IP地址(记录在header头里)
这里我们在生产中遇到一个问题就是.我们有的用户会登录失败.但是并不是所有的用户登录失败(这里是能够正常访问网站) 所以这里想分析哪些用户登录失败,所以我们要记录他们这些登录失败的IP地址 这里我们的结 ...
- Nginx反向代理后,java获取客户端真实IP地址
一般情况下,java获取客户端IP地址的方法为request.getRemoteAddr();但这只是在没有网关或者代理的情况下,如果客户端将请求发送到nginx,再由nginx进行反向代理到目标服务 ...
- 多级nginx代理,获取客户端真实ip
今天服务里的微信公众号支付业务突然不能用了,报错为网络环境未能通过安全验证,请稍后再试.检查后端日志,没有任何问题,看来是成功创建支付订单,但是调起支付时出现了问题.上网查了一下,这个报错的直接原因是 ...
- Nginx反向代理 Laravel获取真实IP地址(PHP)
使用VUE前后端分离开发 后端使用Laravel 想要获取到用户的真实IP地址 因为分离开发不同源跨域问题 所以只能进行前端Nginx反向代理 location /api { rewrite ^/a ...
- Linux SSH登录服务器报ECDSA host key "ip地址" for has changed and you have requested strict checking错误
错误:ECDSA host key "ip地址" for has changed and you have requested strict checking. 解决方案:在终端 ...
- sqlserver服务器名称改成本地IP地址登录
在安装sqlserver2008.2012等时选择的是默认实例,服务器名称也就是电脑的名称,特别是登录本地的数据库,需要输入电脑用户名称加上SQLEXPRESS 例如:zhangsan\SQLEXPR ...
- nginx配置解析之客户端真实IP的传递
前后端分离之后,采用nginx作为静态服务器,并通过反向代理的方式实现接口跨域的方式,在降低开发成本的同时也带来了诸多问题,例如客户端真实IP的获取. 在一些特殊场景下,比如风控和支付流程,往往需要获 ...
随机推荐
- selenium3.0.1调用firefox
报错信息如下时: selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to b ...
- Mybatis分页插件
mybatis配置 <!-- mybatis分页插件 --> <bean id="pagehelper" class="com.github.pageh ...
- excel解析二维数组结构的excel
public void fileImport(Ufile ufile) throws Exception { String filePath = ufile.getFilePath(); List&l ...
- Python自动化 【第十七篇】:jQuery介绍
jQuery jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多),对javascript进行了封装,是的更加便捷的开发,并且在 ...
- php设计模式之单例模式使用示例
单例模式也就是只能实例化一次,也就代表在实例化时不可能使用new关键字,下面是使用示例,大家参考使用吧 <?php class EasyFramework_Easy_Mysql{ p ...
- underscore.js库的浅析
Underscore并没有在原生的JavaScript对象原型中进行扩展,而是像jQuery一样,将数据封装在一个自定义对象中(下文称“Underscore对象”).生成一个Underscore对象: ...
- [AS3]as3画笔实例实现橡皮擦功能源代码
[AS3]as3画笔实例实现橡皮擦功能源代码 //主容器 var main:Sprite = new Sprite(); main.mouseEnabled = false; addChild(mai ...
- 一步一步学WebSocket (一) 初识WebSocket
众所周知,Http协议是无状态的,并且是基于Request/Response的方式与服务器进行交互,也就是我们常说的单工模式.但是随着互联网的发展,浏览器与服务端进行双向通信需求的增加,长轮询向服务器 ...
- cf730e
一道数学题,这篇博客很好:http://blog.csdn.net/morejarphone/article/details/52926627(这样应该不算转载吧) 总结:做这类题目显然应该直接根据相 ...
- cf 733f
给你很多条边,每条边有一个初始边权w1,然后还有一个值表示把这个边权减一的代价w2,然后给你一个预算budget,然后让你输出怎么选边之后构成的树的边权和最小(在用budget减少了边权之后),输出你 ...