Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >nginx proxy_set_header设置、自定义header

nginx proxy_set_header设置、自定义header

作者头像
用户5640963
发布于 2019-07-26 02:32:27
发布于 2019-07-26 02:32:27
17.9K00
代码可运行
举报
文章被收录于专栏:卯金刀GG卯金刀GG
运行总次数:0
代码可运行

先来看下proxy_set_header的语法

语法:

proxy_set_header field value;

默认值:

proxy_set_header Host $proxy_host; proxy_set_header Connection close;

上下文:

http, server, location

允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

proxy_set_header也可以自定义参数,如:proxy_set_header test paroxy_test;

如果想要支持下划线的话,需要增加如下配置:

underscores_in_headers on;

可以加到http或者server中

语法:underscores_in_headers on|off 默认值:off 使用字段:http, server 是否允许在header的字段中带下划线

Java端,需要获取proxy_set_header的参数时,需要使用request.getHeader(field),一般用来获取真实ip地址

--------------------------------------------------------------------------------------------------------------------------------------------------------------

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

问题背景:

在实际应用中,我们可能需要获取用户的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_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和第一台nginx的ip。

那么$proxy_add_x_forwarded_for又是什么?

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

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该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部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户的真实ip,第一台nginx的ip”,这样就清楚了吧。

最后我们看到还有一个$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。

一个例子:

location ~ ^/test1{ proxy_set_header Host test1.z.com; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:81; }

location ~ ^/test2{ proxy_set_header Host test2.z.com; #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:81; }

location匹配多个站点时候,根据test1和test2的不同,匹配到不同的站点。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java服务器获取客户端的真实IP
首先,一个请求肯定是可以分为请求头和请求体的,而我们客户端的IP地址信息一般都是存储在请求头里的。如果你的服务器有用Nginx做负载均衡的话,你需要在你的location里面配置 X-Real-IP和 X-Forwarded-For请求头:
健程之道
2019/11/03
5.1K0
nginx之配置proxy_set_header问题梳理
将左侧匹配到的/proxy_path/开头的url全部转发到后端服务器 192.168.223.137。
小勇DW3
2019/12/20
9.5K0
nginx之配置proxy_set_header问题梳理
nginx反向代理中proxy_set_header 运维笔记
Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义: proxy_set_header Host $proxy_host; proxy_set_header Connection close; 如果启用缓存,来自之前请求的头字段“If-Modified-Since”, “If-Unmodified-Since”, “If-None-
洗尽了浮华
2018/01/23
18.9K0
nginx反向代理中proxy_set_header 运维笔记
nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能。 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)
洗尽了浮华
2018/01/22
3.4K0
nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
Nginx之反向代理
很多场景下,不得不承认Nginx是个好东西,它给我们的跨系统间的访问、安全性方面等等,带来了极大的便利,况且它的性能也极高。
xcbeyond
2020/04/01
9020
nginx反向代理proxy_set_header说明
记录proxy_set_header设置 # 用途 设定被代理服务器接收到的header信息 允许重新定义或添加字段传递给代理服务器的请求头 值可以包含文本、变量和它们的组合 没有定义时会继承之前定义的值 语法: proxy_set_header field value field:变量名 value:变量值 默认值(只有两个字段被重定义): proxy_set_header Host $proxy_host; proxy_set_header Connection close; # 配置说明 项目 值
薛定喵君
2021/07/27
3.4K0
使用 Nginx 搭建 DELMIA Apriso 网络负载平衡集群
通常我们在项目中使用微软的 NLB(Network Load Balancing) 做网络负载均衡。本文将向大家展示如何使用 Nginx 来做网络负载均衡。Nginx 仅仅只是替换掉 NLB,其他服务器架构及配置和以往保持一致
李英杰同学
2021/09/27
1.1K0
谈谈个人网站的建立(五)—— 小集群的部署
欢迎访问我的个人网站O(∩_∩)O哈哈~希望大佬们能给个star,个人网站网址:http://www.wenzhihuai.com,个人网站代码地址:https://github.com/Zephery/newblog。 洋洋洒洒的买了两个服务器,用来学习分布式、集群之类的东西,整来整去,感觉分布式这种东西没人指导一下真的是太抽象了,先从网站的分布式部署一步一步学起来吧,虽然网站本身的访问量不大==。 nginx负载均衡 一般情况下,当单实例无法支撑起用户的请求时,就需要就行扩容,部署的服务器可以分机房、分
Zephery
2018/03/12
1.9K0
谈谈个人网站的建立(五)—— 小集群的部署
Nginx proxy_set_header 理解
用户认证接口:根据客户端IP和port,进行IP反查和端口范围确认,如符合则用户认证通过。 当前使用的是Nginx负载均衡,从客户端到Nginx端 ip和port都对,从Nginx到应有服务器上-port端口变成很奇怪的端口号。真是遇到的问题,登录页的ip和port在登录验证没有问题,但在登录完成后跳转的时候,端口号发生了变化。跟nginx服务器的监听端口相同了。(注:除了部署的Nginx服务器,应该还有一个前端的nginx,这是我没有接触到的部分。) 疑问:Nginx往应有服务器上 是如何 传递 客户端IP和port 参数的呢? 请看 Nginx proxy_set_header
用户5640963
2019/07/26
1.1K0
Nginx
刚开始做这个网站的时候,只有一个定时任务jar包,每天定时给指定用户发短信,后来觉得其他人可能也需要这种服务,在其基础上二次开发,可扩展多任务,多用户定时任务,赚了一点点,这时候已经是部署在tomcat上了,端口占用80; 后来想自己做博客,但是博客想要使用主域名,即原服务需要修改端口,但是这种形式容易忘记端口,还需要去防火墙重新放开一个端口,想的是一个二级域名可以直接访问,这时候想到Nginx!
不期而遇丨
2022/09/09
5200
Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解
代表客户端IP。注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。假设用户请求过程如下:
授客
2021/11/10
8.3K0
Nginx简单介绍
Nginx(发音同engine x)是一个网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。 Nginx在官方测试的结果中,能够支持五万个平行连接,而在实际的运作中可以支持二万至四万个平行链接。 整体采用模块化设计是nginx的一个重大特点,甚至http服务器核心功能也是一个模块。 旧版本的Nginx的模块是静态的,添加和删除模块都要对Nginx进行重新编译,1.9.11以及更新的版本已经支持动态模块加载。 —— 来自维基百科
epoos
2022/06/06
5190
proxy_pass根据path路径转发时的"/"问题记录
在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/。当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。 比如下面设置: location ^~ /wangshibo/ { proxy_cache js_cache; proxy_set_header Host js.test.com; proxy_pass http://js.test.com/; } 如
洗尽了浮华
2018/01/23
2.8K0
在NGINX中根据用户真实IP限制访问
需要根据用户的真实IP限制访问, 但是NGINX前边还有个F5, 导致deny指令不生效.
东风微鸣
2022/04/21
3K0
在NGINX中根据用户真实IP限制访问
Nginx代理proxy pass配置去除前缀
比如,访问abc.com/appv2/a/b.html, 要求转发到localhost:8088/appv2/a/b.html
Ryan-Miao
2018/12/05
5.6K0
Web服务器-Nginx流量镜像(Mirror)
我们上一大章介绍了Kubernetes的知识,本章节我们进入中间件的讲解,这里会包含很多不同的类型组件,中间件的第一个大类我这里定义的是Web服务器。由于目前使用最广泛的Web服务器是Nginx,所以我们这里的讲解主要以Nginx服务器为主。
运维小路
2025/04/13
3480
Web服务器-Nginx流量镜像(Mirror)
nginx常用配置
proxy_redirect 该指令用来修改被代理服务器返回的响应头中的Location头域和“refresh”头域。
章工运维
2023/05/19
9690
Nginx反向代理配置
反向代理(Reverse Proxy)是一种网络服务器的部署模式,其代理请求的方向与正常的代理服务器相反,即客户端发送请求时,请求先到达反向代理服务器,然后再由反向代理服务器将请求转发到目标服务器,最后将响应发送回客户端。
灬沙师弟
2023/07/08
1.1K0
Nginx反向代理配置
nginx rewrite与proxy_pass共用问题分析二
我们对比下同时使用 rewrite 与 proxy_pass 与单独使用其中一个的情况下,服务端获取到的 url 的表现。获取 url 的代码如下:
山行AI
2019/11/12
5.9K0
nginx rewrite与proxy_pass共用问题分析二
Web服务器-Nginx反向代理(一)
作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/04/05
2850
Web服务器-Nginx反向代理(一)
相关推荐
Java服务器获取客户端的真实IP
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档