`
gong1208
  • 浏览: 558930 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用nginx后如何在web应用中获取用户ip及原理解释

阅读更多

 

        使用nginx后如何在web应用中获取用户ip及原理解释

                                                                                                 -------gongyong

 

问题背景:

在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了nginx作为反向代理后,使用request.getRemoteAddr()获取到的就一直是nginx服务器的ip的地址,那这时应该怎么办?

 

part1:解决方案

我在查阅资料时,有一本名叫《实战nginx》的书,作者张晏,这本书上有这么一段话“经过反向代理后,由于在客户端和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")

这样就明白了吧。

 

part2:原理介绍

这里我们将nginx里的相关变量解释一下,通常我们会看到有这样一些配置

server {

        listen       88;

        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /{

            root   html;

            index  index.html index.htm;

                            proxy_pass                  http://backend; 

           proxy_redirect              off;

           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_set_header            X-Forwarded-For $http_x_forwarded_for;

        }

我们来一条条的看

1. proxy_set_header    X-real-ip $remote_addr;

这句话之前已经解释过,有了这句就可以在web服务器端获得用户的真实ip

但是,实际上要获得用户的真实ip,不是只有这一个方法,下面我们继续看。

 

2.  proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标准,所以默认是没有的,需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute("X-Forwarded-For")获取不到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加如下配置:

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

意思是增加一个$proxy_add_x_forwarded_forX-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和第一台nginxip

 

那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,即用户访问该web通过两台nginx

在第一台nginx中,使用

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

 

到了第二台nginx,使用

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip$remote_addr部分的值是上一台nginxip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginxip”,这样就清楚了吧。

 

最后我们看到还有一个$http_x_forwarded_for变量,这个变量就是X-Forwarded-For,由于之前我们说了,默认的这个X-Forwarded-For是为空的,所以当我们直接使用proxy_set_header            X-Forwarded-For $http_x_forwarded_for时会发现,web服务器端使用request.getAttribute("X-Forwarded-For")获得的值是null。如果想要通过request.getAttribute("X-Forwarded-For")获得用户ip,就必须先使用proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;这样就可以获得用户真实ip

 

 

ps:变量名太长,自己感觉看着好晕,打字打的我眼睛都花了,希望解释清楚了,如果有疑问可以和我交流,共同学习。

 

版权所有,转载请著名作者来源,支持原创,copy可耻

 

 

分享到:
评论
4 楼 libran 2014-03-13  
Dev_song 写道
应该是request.getHeader("X-real-ip")吧

正解!
3 楼 Dev_song 2014-03-08  
应该是request.getHeader("X-real-ip")吧
2 楼 doooook 2013-08-16  
学习了
1 楼 z8367 2013-03-27  

相关推荐

    java非常强的获取客户端真实IP的两种方法

    然而,在实际应用场景中,客户端请求往往经过了多级代理(如Apache、Squid等),这使得直接使用`request.getRemoteAddr()`方法获取到的IP地址并不是客户端的真实IP,而是代理服务器的IP地址。 例如,在使用Apache或...

    Nginx企业级WEB服务器实战

    根据Netcraft在2017年4月份的统计数据,全球最繁忙的网站中有大约28.72%使用Nginx作为服务器或代理服务器。许多知名的互联网公司如京东、360、百度、新浪、腾讯和阿里巴巴等均采用Nginx作为其WEB服务器的基础之一。 ...

    Nginx高性能WEB服务器系列(超级详细)

    综上所述,Nginx 作为一款优秀的高性能 WEB 服务器,在实际应用中具有广泛的应用场景。通过对上述知识点的学习和实践,可以更好地掌握 Nginx 的配置和优化技巧,为企业搭建高效稳定的 WEB 服务提供有力支持。

    java获取用户真实ip

    在探讨如何通过Java获取用户的真实IP地址之前,我们先来了解一下为什么这是一项重要的任务。在Web开发中,了解客户端的IP地址对于统计访问来源、安全验证(如防止恶意攻击)、地理定位等功能至关重要。然而,由于...

    Nginx 应用技术指南

    Nginx的设计采用了模块化架构,这意味着用户可以根据实际需求选择合适的模块进行编译,从而定制出最适合自身应用场景的Web服务器。 **1.5 支持SSL和TLS SNI** 随着HTTPS的普及,Nginx也支持了SSL/TLS加密传输,并且...

    nginx高性能web服务器详解

    本篇文章将深入探讨Nginx的核心特性、工作原理以及在实际部署中的关键配置和优化策略。 一、Nginx简介 1.1 Nginx特点: - 非阻塞I/O模型:Nginx采用事件驱动的异步非阻塞模型,能有效处理大量并发连接。 - 动态...

    https通信nginx反向代理443端口

    3. **配置完成后,需要测试Nginx配置文件的语法正确性**,使用命令`nginx -t`。如果无误,可以使用`systemctl reload nginx`或`service nginx reload`来应用新的配置。 4. **启动或重启Nginx服务**:确保Nginx服务...

    nginx脚本引擎与rewrite设计原理(一)

    在rewrite规则的执行中,Nginx首先解析条件表达式,确定是否应应用特定的rewrite规则。一旦条件满足,它将使用`ngx_http_script_run_variables`函数执行相关的脚本,这个过程涉及到对配置期间创建的`ngx_...

    nginx离线部署所需所有依赖包

    在IT行业中,Nginx是一款广泛应用的开源Web服务器,以其高性能、稳定性以及模块化设计而闻名。当在没有网络连接的环境下进行部署时,离线部署成为必要的选择。本资源包"nginx离线部署所需所有依赖包"就是为了满足...

    nginx于resin集成(nginx安装)

    Nginx以其高性能、低内存占用和反向代理能力而闻名,而Resin则是一款基于Java的Servlet容器,适用于处理Java Web应用程序。将Nginx与Resin集成可以充分利用两者的优点,实现高效的前端静态资源处理和后端动态内容的...

    Nginx安装配置.rar

    **Nginx安装配置** Nginx是一款高性能的Web服务器,常用于反向代理、负载...记得在安装过程中关注每一个步骤,参考提供的"nginx安装步骤.docx"文档和"2 Nginx工作原理及安装配置.ts"视频,以便更好地掌握Nginx的使用。

    Nginx+Tomcat+Keepalived实现高可用Web集群.docx

    在构建高可用的Web服务环境中,Nginx、Tomcat和Keepalived是三个关键组件。Nginx作为一个高性能的HTTP反向代理服务器,主要负责负载均衡和静态资源处理,减轻后端应用服务器(如Tomcat)的压力。Tomcat则作为Java...

    离线安装nginx相关rpm包

    6. **测试nginx**:在浏览器中输入服务器的IP地址,如果能看到nginx的欢迎页面,说明安装成功。 离线安装nginx涉及的知识点包括:Linux系统管理、RPM包管理、nginx服务器的基本原理和配置、以及网络服务的启动和...

    nginx-1.9.14.rar

    解压后,用户可以直接在Windows操作系统上运行,便于对Nginx进行配置和学习。 1. **Nginx的基本结构与功能**: Nginx采用模块化设计,主要包括核心模块、HTTP模块、邮件协议模块等。核心模块负责处理连接请求,而...

    Python使用django获取用户IP地址的方法

    在Python的Web开发框架Django中,获取用户IP地址是一项常见的需求,这有助于进行日志记录、数据分析或者安全控制。本篇文章将详细讲解如何在Django...理解这些原理和方法对于开发需要依赖用户IP信息的Web应用至关重要。

    nginx实现多个tomcat7直接session共享所需jar包

    Session是Web应用中用于跟踪用户状态的一种机制,通常存储在服务器端。当用户登录后,服务器会为该用户创建一个唯一的Session ID,并将其通过Cookie返回给浏览器。之后,每次用户请求时,浏览器都会将这个Session ID...

    nginx-1.6.2.tar.gz nginx-1.6.2下载

    Nginx 是一款高性能的 Web 服务器和反向代理服务器,广泛应用于互联网行业,以其轻量级、高并发、低内存消耗的特点著称。在本篇中,我们将深入探讨 Nginx 的核心功能以及 Nginx 1.6.2 版本的相关特性。 1. **Nginx ...

    快速扫描C段web应用,获取请求状态code、server、title信息.zip

    在IT行业中,Web应用是企业和个人服务用户的主要平台。快应用是一种新兴的移动应用形态,它结合了传统APP和H5网页的优点,旨在提供更快捷、更轻量级的用户体验,尤其适合企业级应用。本压缩包“快速扫描C段web应用,...

    nginx入门到精通

    Nginx 是一款高性能、轻量级的网络服务器,广泛应用于Web服务器和反向代理服务器。它的主要特点包括高并发处理能力、低内存占用以及灵活的配置机制,使其成为众多企业和开发者的选择。本教程将带你从零基础开始,...

    nginx-accesskey-2.0.3.tar.gz

    Nginx 是一款高性能的 Web 服务器和反向代理服务器,广泛应用于各种场景。其中,Nginx AccessKey 插件就是为了解决网站防盗链问题而设计的。本文将深入探讨这个插件的功能、工作原理以及如何在实际环境中部署和配置...

Global site tag (gtag.js) - Google Analytics