Nginx获取用户真实IP地址

本人在一次项目中,使用Nginx需要获取到用户IP,本来可以很常规的获取的,可现实往往不常规,项目是前后端分离的,部署时,前端使用了Nginx进行了代理并转发,后端也使用了Nginx进行了负载均衡和代理,分别部署在两台机器上,使用的不是同一个Nginx,所以此处当用户的请求过来时,先是通过前端Nginx转发到后端Nginx,后端Nginx再转发到具体的服务上,当时使用常规手法获取IP,结果获取到的是前端部署的机器IP。

在此本人通过了Nginx的realip模块进行了获取,特此来记录一下。

使用Nginx自带模块realip模块获取IP地址

首先来看看配置文件,此处只展示主要部分

http {
include mime.types;
default_type application/octet-stream; #access_log logs/access.log main;
access_log off;
error_log off;
sendfile on;
#tcp_nopush on; #keepalive_timeout 0;
keepalive_timeout 65; #gzip on;
#负载均衡配置
upstream serverCluster{
server 127.0.0.1:82 weight=1;
server 192.168.0.80:81 weight=1;
} server {
listen 80; #监听的端口
server_name yunque.natapp1.cc; #配置负载均衡
location /{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://serverCluster;
set_real_ip_from 192.168.1.0/254;
real_ip_header X-Real-IP;
real_ip_recursive on;
expires 3d;
}
} }

set_real_ip_from  127.0.0.1; #这一网段过来的请求全部使用X-Real-IP里的头信息作为remote_addr
real_ip_header X-Real-IP;#从哪个header头检索出所要的IP地址
real_ip_recursive on; #开启

接下来就是测试配置是否正确

# 在Nginx安装目录下输入一下命令
./sbin/nginx -tc conf/nginx.conf

如果报一下错:

说第66行是未知的命令,表示当前Nginx没有相关realip模块,所以缺少该模块相关命令

下载realip模块并进行配置

找到Nginx解压的目录,在该目录下输入以下命令

# 下载http_realip_module模块
./configure --prefix=/usr/local/nginx-1.4.1 --with-http_realip_module --原来有的模块(如果有的话)
# 查看Nginx版本号 (/usr/local/nginx/是你Nginx服务器的实际位置)
/usr/local/nginx/sbin/nginx -V

查看configure arguments:后边有没有值,如果有,就复制下来。

配置完成后,运行命令make命令

make
# 注意,此处不能mark install 否则就是覆盖安装

替换已安装好的Nginx包

替换之前先备份:

cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

先停止Nginx服务

# 停止服务
./usr/local/nginx/sbin/nginx -s stop

将刚刚编译好的nginx覆盖掉原有的nginx

# 在Nginx解压目录下使用以下命令
cp ./objs/nginx /usr/local/nginx/sbin/ # 通过查看版本命令收看是否下载SSL模块成功
/usr/local/nginx/sbin/nginx -V

启动服务即可,命令如下

./usr/local/nginx/sbin/nginx

Nginx获取用户真实IP的更多相关文章

  1. CDN下nginx获取用户真实IP地址

    随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户 ...

  2. 通过Nginx获取用户真实IP

    nginx配置 location / { proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set ...

  3. 在有nginx做反向代理时候,如何获取用户真实Ip信息

    在获取用户的Ip地址时,不一定可以获取到用户真实的地址信息,这要看代理服务器的类型,代理服务器有普通匿名代理服务器,高匿代理服务器,像这种情况很难获取到用户真实的Ip地址 假如用户没有使用匿名代理服务 ...

  4. nginx反向代理获取用户真实ip

    nginx做反向代理时,默认的配置后端获取到的ip都是来自于nginx,如何转发用户的真实ip到后端程序呢?如是是java后端,用request.getRemoteAddr();获取到的是nginx的 ...

  5. 多层代理获取用户真实IP

    1. 几个概念remote_addr:如果中间没有代理,这个就是客户端的真实IP,如果有代理,这就是上层代理的IP.X-Forwarded-For:一个HTTP扩展头,格式为 X-Forwarded- ...

  6. 获取用户真实IP:(模拟:客户端--F5--nginx--tomcat 后端获取用户真实IP)

    模拟:客户端--F5--nginx--tomcat 后端获取用户真实IP 192.168.109.137 :nginx01(充当第一层代理==F5)192.168.109.138 :nginx02(二 ...

  7. 如何根据HttpServletRequets获取用户真实IP地址

    最近的一个项目的某个功能获取用户的ip地址,添加用户的系统使用记录. 我发现当我直接使用getRemoteAddr()方法从HttpServletRequet中获取用户的ip时,获取到的是服务器的ip ...

  8. nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)

    在nginx中常用的有以下四种负载均衡的算法,分别是:round-robin.ip-hash.least-connected和weighted.当然在实际生产中或许使用最多的就是ip-hash了,一般 ...

  9. PHP获取用户真实 IP , 淘宝IP接口获得ip地理位置(转)

    <?php /** * 获取用户真实 IP */ function getIP() { static $realip; if (isset($_SERVER)){ if (isset($_SER ...

  10. java 获取用户真实ip

    /** * 获取用户真实ip * @param request * @return */ public static String getIpAddr(HttpServletRequest reque ...

随机推荐

  1. 在Jupyter Notebook,沉浸式体验ChatGPT

    大家好,我是章北海mlpy 写代码,修Bug是 ChatGPT 目前最擅长的领域之一 今天向大家推荐一个刚刚开源的Python包 安装后可以直接在IPython和Jupyter Notebook中直接 ...

  2. 从 API 网关聊到 API 管理

    在 API 管理中,通常会有这些痛点: 1.企业不清楚到底有多少个API,无法形成API资产管理等问题. 2.API在不同集群的生命周期问题. 3.API运行状态监控和告警问题. 4.API请求限流. ...

  3. 数据结构(DataStructure)-02

    数据结构-02 **数据结构-01回顾** **数据结构-02笔记** **作业讲解** **链表作业题一** **链表作业题二** **链表作业题三** **线性表 - 栈(LIFO)** **线性 ...

  4. cf1774f解题报告

    Magician and Pigs 分析一下三个操作分别干了些什么 新添一只猪 使血量为 \(x\) 的猪血量变为 \(\max(x-v,0)\) 设前面操作后猪总共会受到 \(s\) 的伤害,复制一 ...

  5. [ZJOI2020] 序列 线性规划做法/贪心做法

    线性规划做法 同时也作为线性规划对偶的一个小小的学习笔记. 以下 \(\cdot\) 表示点积,\(b,c,x,y\) 是行向量. \(A\) 是矩阵,对于向量 \(u,v\) 若 \(\forall ...

  6. JVM面试和学习中需要注意的部分

    内存结构 1.方法区用来存储类加载的数据,例如类的名称,方法入口 2.JVM虚拟机栈用于存储线程,包括局部变量和方法参数 3.堆内存用来存储对象 4.方法区的规范实现:永久代和元空间 5.方法区 JV ...

  7. 2023-03-16:给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分, 使得所有这些部分表示相同的二进制值。 如果可以做到,请返回任何 [i, j],其中 i+1 < j

    2023-03-16:给定一个由 0 和 1 组成的数组 arr ,将数组分成 3 个非空的部分, 使得所有这些部分表示相同的二进制值. 如果可以做到,请返回任何 [i, j],其中 i+1 < ...

  8. 使用doop识别最近commons text漏洞的污点信息流

    作者:vivo 互联网安全团队 - Chen Haojie 本文基于笔者对doop静态程序分析框架源代码和规则学习,并结合对目前漏洞公开技术细节的学习,修改增强doop app only模式下的分析规 ...

  9. JQuery的认识和安装

    jQuery 是一个 JavaScript 函数库. jQuery 是一个轻量级的"写的少,做的多"的 JavaScript 库. jQuery 库包含以下功能: HTML 元素选 ...

  10. 一个.Net强大的Excel控件,支持WinForm、WPF、Android【强烈推荐】

    推荐一个强大的电子表单控件,使用简单且功能强大. 项目简介 这是一个开源的表格控制组件,支持Winform.WPF和Android平台,可以方便的加载.修改和导出Excel文件,支持数据格式.大纲.公 ...