因为架构的需要采用多级 Nginx 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。
同样适用于前端是 Squid 或者其他反向代理的情况。
首先前端的 Nginx 要做转发客户端 IP 的配置 :
location / {
proxy_pass http://localhost:8000;
# Forward the user's IP address to Rails
proxy_pass http://localhost:8000;
# Forward the user's IP address to Rails
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
}
后端的 Nginx 需要安装一个 Module: NginxHttpRealIpModule ,编译的时候默认不包含此 Module,需要重新编译安装 Nginx,configure 的时候加上 –with-http_realip_module,Nginx 升级或者添加/删除 Module 时支持热切换 ,可以避免中断服务。
升级后配置 NginxHttpRealIpModule,set_real_ip_from 就是指前端 Nginx 或者 Squid 的 IP:
location / {
proxy_pass http://localhost:8000;
# Forward the user's IP address to Rails
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;
# NginxHttpRealIpModule
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 192.168.2.1;
real_ip_header X-Real-IP;
}
proxy_pass http://localhost:8000;
# Forward the user's IP address to Rails
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;
# 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 反向代理,但是后端的程序获取到的客户端 IP 都是前端 Nginx 的 IP,问题的根源在于后端的 Nginx 在 HTTP Header 中取客户端 IP 时没有取对正确的值。 同样适用于前端是 Squid 或者...
在本场景中,我们要探讨的是如何通过Nginx配置文件实现客户端IP的转发功能,这对于网站访问日志分析、安全策略实施以及负载均衡等都有着重要的作用。我们将主要分析两个配置文件:`nginx.conf`和`default.vhosts....
在本文中,我们将讨论如何利用多级 Nginx 反向代理来隐藏 C2 通信,提高隐蔽性。 首先,我们要了解 Nginx 反向代理的基本原理。Nginx 是一款高性能的 HTTP 和反向代理服务器,可以将客户端请求转发到其他服务器,...
nginx+lua+redis通过匹配客户端ip进行灰度发布 本文将讲述如何使用nginx、lua和redis来实现灰度发布,通过匹配客户端IP来实现灰度发布。灰度发布是一种常见的软件发布方式,它允许开发者在生产环境中发布新的版本,...
然而,在实际应用中,很多情况下用户的请求会经过反向代理服务器(如Nginx、Squid等),这使得直接使用`request.getRemoteAddr()`方法获取到的IP地址往往并不是客户端的真实IP地址。 #### 二、问题分析 当客户端...
然而,在实际应用场景中,客户端请求往往经过了多级代理(如Apache、Squid等),这使得直接使用`request.getRemoteAddr()`方法获取到的IP地址并不是客户端的真实IP,而是代理服务器的IP地址。 例如,在使用Apache或...
然而,在某些情况下,如通过反向代理服务器(如Nginx、Apache)或负载均衡器访问时,这个方法可能返回的是代理服务器的IP而非客户端的真实IP。这时,我们需要检查X-Forwarded-For头部,该头部通常包含了客户端的IP...
2. **X-Real-IP 头部**:为了解决这个问题,Nginx支持通过HTTP头部传递客户端IP。后端服务器可以检查`X-Real-IP`头部来获取真实IP。当Nginx接收到客户端请求时,我们可以配置Nginx将客户端IP添加到`X-Real-IP`头部,...
nginx源码,非常好的学习材料 有助于详细学习nginx设计原理 设计模式 值得研习
在IT领域,获取客户端MAC(Media Access Control)地址是一项常见的需求,主要用于设备识别或网络管理。本文将详细解析“获取客户端MAC地址Demo”的工作原理、使用方法及其在实际应用中的重要性。 首先,MAC地址是...
在Nginx配置文件(通常是`/etc/nginx/nginx.conf`或`/usr/local/nginx/conf/nginx.conf`)中,可以使用`allow`和`deny`指令来允许或禁止特定IP或IP段的访问。以下是一个示例: ```nginx server { listen 80; ...
若Nginx启用了SSI(服务器端包含),还可以在403页面中显示被封禁的客户端IP地址,使用SSI指令输出REMOTE_ADDR变量的值。 完成403页面的编辑后,需要在nginx.conf中添加配置,将403错误重定向到自定义的静态页面: ...
对于Nginx,一个IP上配置多个站点还是很常见的。尤其是在开发环境上,更是如此。 下面在我的阿里云上简单的实现这样一个需求: 在一个IP上通过对端口区分来配置多个站点。 环境初始化目录一览配置站点准备添加配置...
本文讨论了在线上环境中,服务端长连接和客户端短连接配置不当导致Nginx服务器产生大量“TIME_WAIT”状态线程的问题,同时提供了问题的分析和解决方法。本文主要涉及的网络编程知识点包括长连接与短连接的定义和区别...
3. 配置限制IP访问次数:HttpLimitReqModule模块是通过limit_req_zone指令来定义限制区域,包括存储空间、键值(比如客户端的IP地址)和限制速率等参数。通过limit_req指令对特定位置(location)进行限制,可以设置...
在本案例中,我们关注的是Nginx如何使用其配置指令来根据客户端IP地址改变请求的处理逻辑。具体到本文所描述的场景,目的是实现当特定的IP地址访问某个URL时,将其重定向到另一个URL,而其它非特定的IP地址访问相同...
例如,`proxy_protocol`可以启用Nginx与上游服务器之间的代理协议,以便获取客户端的真实IP;`proxy_set_header`可以设置传递给后端服务器的头部信息。 总之,Nginx的TCP代理转发功能使得我们可以利用其强大的性能...
通常,当用户通过Nginx访问服务时,Nginx会作为客户端与服务器建立Socket连接,这时服务器接收到的Socket连接请求的源IP将是Nginx的IP,而不是用户的IP。为了获取用户的真实IP,我们需要利用HTTP头部信息,特别是"X-...
Nginx: PV、UV、独立IP 做网站的都知道,平常经常要查询下网站PV、UV等网站的访问数据,当然如果网站做了CDN的话,nginx本地的日志就没什么意义了,下面就对nginx网站的日志访问数据做下统计; 概念: UV(Unique ...
python脚本 从nginx的访问log,获取访问IP,记录到redis,根据IP访问数量判断是否存在安全问题,记录不正常IP,(写入到防火墙过滤-待完成)