精华内容
下载资源
问答
  • proxy_set_header 其他项等 总结 三、扩展 ->脚本 proxy_set_header $host $proxy_host $http_host 各个变量含义 python 获取请求所有数据信息脚本 本文会先由一个问题引入,然后再进行多种情况进行分析。 ...
    一、问题和排查步骤
        1.1 问题基本信息
        1.2 问题解析
        1.3、解决办法
    二、扩展-各种情况对比
        默认两项
        proxy_set_header 其他项等
        总结
    三、扩展 ->脚本
        proxy_set_header $host $proxy_host $http_host 各个变量含义
        python 获取请求所有数据信息脚本
    

    本文会先由一个问题引入,然后再进行多种情况进行分析。
    一、问题和排查步骤
    1.1 问题基本信息

    ​ 我们应用程序从代码层面收到的 Header 中的 Host 的值是 upstream 的 名称。 我们程序是需要获取到实际的值。所以这里存在一个问题。

    我们先看看我们的 nginx 配置。

    upstream open-hz8443{
    server 10.60.6.184:8000 max_fails=1 fail_timeout=3s weight=10;
    }

    server{
    server_name 192.168.80.132;
    listen 80;
    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_connect_timeout 3s;
    proxy_read_timeout 120s;
    proxy_send_timeout 120s;
    proxy_next_upstream error timeout invalid_header http_404 http_502 http_504 http_500;

        location / {
                proxy_pass http://open-hz8443;
        }
        location ^~ /wss/v1
        {
            proxy_pass  http://open-hz8443;
            proxy_set_header Connection "upgrade";
            proxy_set_header Upgrade $http_upgrade;
            tcp_nodelay on;
        }
    

    }

    我们请求 http://192.168.80.132/wss/v1, 我们可以在后端(10.60.6.184:8000)获取到 Host 的值为 open-hz8443。

    这个是我们做了一个 脚本,用于获取请求的所有的数据的。 脚本具体内容在文末。

    Connection: upgrade
    Host: open-hz8443 # 获取到的Host 是 open-hz8443
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 FS
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9

    10.210.20.43 - - [04/Jan/2021 15:54:46] “GET /wss/v1 HTTP/1.0” 200 -

    1.2 问题解析

    首先这里有知识点:

    我们在 Server 配了 proxy_set_header Host $host; , 我们在 location 是只配置了
    
    proxy_set_header Connection "upgrade";
    proxy_set_header Upgrade $http_upgrade;
    
    我们的 Host 最初我认为是会继承 Server 配置的 proxy_set_header Host $host; , 但是明显是没有继承的,而是直接拿的 upstream 的名称。说明没有继承,那么这里是有一个什么规则? 我们往下看。
    
    查询 Nginx 官方文档。
    
        http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
    
    Allows redefining or appending fields to the request header passed to the proxied server. The value can contain text, variables, and their combinations. These directives are inherited from the previous configuration level if and only if there are no proxy_set_header directives defined on the current level. By default, only two fields are redefined:
    
    大概意思就是当我们没有设置 proxy_set_header 才会从上一层级继承,当我们设置了 proxy_set_header ,也就意味着我们不从上面 server 的 proxy_set_header Host $host; 进行继承。
    
    那为什么会显示 open-hz8443, 是因为有一个默认值
    
    proxy_set_header Host       $proxy_host;
    
    这个 proxy_host,
        当我们设置了 upstream 的话,也就是上面的例子$proxy_host 就是 upstream的名称值.
        当我们直接使用的 proxy_pass http://10.60.6.184:8000 的话,那么 $proxy_host 表示的就是 10.60.6.184:8000
    

    1.3、解决办法

    在 location ^~ /wss/v1 下面增加配置 proxy_set_header Host $host;。

        location ^~ /wss/v1
        {
            proxy_pass  http://open-hz8443;
            proxy_set_header   Host     $host;
            proxy_set_header Connection "upgrade";
            proxy_set_header Upgrade $http_upgrade;
            tcp_nodelay on;
        }
    

    二、扩展-各种情况对比
    默认两项

    proxy_set_header Host $proxy_host;
    proxy_set_header Connection close;

    proxy_set_header 其他项等

    proxy_set_header Connection “upgrade”;
    proxy_set_header Upgrade $http_upgrade;

    Server 设置 proxy_set_header 其他项 Server 设置 proxy_set_header 默认两项 location 设置 proxy_set_header 默认两项 location 设置 proxy_set_header 其他项 默认值生效 默认值不生效
    1 1 1 1 1 继承location
    1 1 0 1 1(不继承Server)
    1 1 1 0 1 继承location
    1 1 0 0 1 继承server
    1 0 1 0 1 继承location
    1 0 0 0 1 默认
    1 0 0 11 1 默认
    1 0 1 1 1 继承location
    0 1 0 0 1 继承server
    0 1 0 1 1 默认
    0 1 1 0 1 继承location
    0 1 1 1 1 继承location
    0 0 0 1 1 默认
    0 0 1 0 1 继承location
    0 0 1 1 1 继承location
    0 0 0 0 1 默认
    总结

    location 设置了 proxy_set_header 就不继承,但继承默认值,默认值优先级低于 location设置。
    location 未设置了proxy_set_header ,就往上继承,直到默认值。
    

    只要调用了 proxy_set_header,并没有设置 host 和 connection ,默认重写host、connection两个头。
    三、扩展 ->脚本
    proxy_set_header $host $proxy_host $http_host 各个变量含义

    记录一次 Nginx 配置 proxy_pass 后 返回404问题
    python 获取请求所有数据信息脚本

    #!/usr/bin/env python

    import SimpleHTTPServer
    import SocketServer

    PORT = 8000

    class GetHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
    print(self.headers)
    self.send_response(200, “”)
    def do_POST(self):
    print(self.headers)
    content_length = self.headers.getheaders(‘content-length’)
    length = int(content_length[0]) if content_length else 0
    print(self.rfile.read(length))
    self.send_response(200, “”)

    Handler = GetHandler
    httpd = SocketServer.TCPServer(("", PORT), Handler)
    httpd.serve_forever()

    展开全文
  • 但是,proxy_set_header设置为7010端口,所有的请求都到了10.0.0.100:8080这台应用,就无法起到负载均衡的作用. 问题来了,要实现如下功能,应如何配置呢. 1,用户必须统一入口(10.0.0.0.102). 2,请求必须经过10.32.4...
  • Nginx proxy_set_header 理解

    千次阅读 2019-08-20 15:44:17
    除request.getRemoteAddr();获取的值不对外,其他值都是对的。 getRemoteAddr获取的是代理的请求地址。 因重定义了host,所以test值被改写成代理服务器IP。...弄清楚是怎么传值的,正确的使用Nginx又向前进了一步。 ...

    除request.getRemoteAddr();获取的值不对外,其他值都是对的。
    getRemoteAddr获取的是代理的请求地址。
    因重定义了host,所以test值被改写成代理服务器IP。
    因重定义了 X-Real-PORT-并传递$remote_port,客户端port也获取正确啦。
    弄清楚是怎么传值的,正确的使用Nginx又向前进了一步。

    展开全文
  • nginx proxy_set_header设置、自定义header

    千次阅读 2019-05-15 21:56:20
    转自:... 先来看下proxy_set_header的语法 语法: proxy_set_headerfieldvalue; 默认值: proxy_set_header Host $proxy_host; proxy_set_header Conne...

    转自:https://blog.csdn.net/bao19901210/article/details/52537279

    先来看下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 时,会从上面的级别中继承。默认情况下,只有两个请求头会被重新定义:

    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.getHeader("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;

                      

            }

    我们来一条条的看

    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.getHeader("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.getHeader("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.getHeader("X-Forwarded-For")获得的值是null。如果想要通过request.getHeader("X-Forwarded-For")获得用户ip,就必须先使用proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;这样就可以获得用户真实ip。

    展开全文
  • 场景:在用Nginx做反向代理的时候,加入...经过老大的解决后加了一行proxy_set_header Host $proxy_host就成功转发了,具体代码如下: location ~ ^/api/([0-9]+)(\.[0-9]+)*/application/ { proxy_pass http://...

    场景:在用Nginx做反向代理的时候,加入转发的地址后一直所有API都返回的状态码404,看upstream的时候健康检查没有问题。经过老大的解决后加了一行proxy_set_header Host $proxy_host就成功转发了,具体代码如下:

    location ~ ^/api/([0-9]+)(\.[0-9]+)*/application/ {
        proxy_pass http://xxx.xxx.xxx;
        proxy_set_header Host $proxy_host;
    } 
    

    百度后才知道,Nginx需要重写请求头,比如说我们需要访问http://aaa.host.com/api/v1/application,通过nginx转发到http://bbb.newhost.com/api/v1/application,如果没有重写的话,包的请求头仍是aaa.host.com,也就出现了404的情况。$proxy_host表示的代理转发的地址。
    参考资料:
    https://blog.csdn.net/weixin_41585557/article/details/82426784

    展开全文
  • nginx proxy_set_header Host $http_host 配置

    千次阅读 2018-02-06 18:56:00
    其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而...
  • proxy_set_header设置Host为$proxy_host,$host与$local_host的区别 转载 2015年11月18日 22:29:28 9689 先来看下proxy_set_header的语法 语法: proxy_set_header field value; 默认值: proxy_...
  • 在使用Nginx做反向代理的时候,proxy_set_header功能可以设置反向代理后的http header中...Nginx的官网文档中说下面这两条是做反代时默认的,所以$proxy_host 自然是 proxy_pass后面跟着的host了 proxy_set_header Hos
  • Nginx指令add_headerproxy_set_header的区别

    万次阅读 多人点赞 2019-07-09 17:33:37
    如何理解反向代理? Nginx是反向代理服务器,我们可以从下面的图来理解为什么是反向代理。以Nginx为中心,数据的流向是从Server到Nginx再到Client,注意我...proxy_set_header和add_header的区别 区别:proxy_set...
  • nginx反向代理中的proxy_set_header

    千次阅读 2019-09-06 15:51:14
    nginx作为反向代理时,proxy_set_header设置的请求头是传递给后端服务器的。 为什么? 场景一: 后端服务器想要知道用户的真实IP,就可以通过proxy_set_header来传递给后端服务器。 场景二: 后端服务器想...
  • 文章目录场景参考文档用法 ...nginx.org proxy_set_header 用法 语法 Syntax: proxy_set_header field value; Default: proxy_set_header Host $proxy_host; proxy_set_header Connection close; Context: htt...
  • nginxproxy_set_header 的作用

    千次阅读 2018-02-09 23:02:51
    其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。 Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而...
  • nginxproxy_set_header Host $host的作用

    万次阅读 2020-10-30 18:54:03
    nginx配置upstream负载均衡后请求400,配置proxy_set_header Host $host成功.请问这是什么原理?proxy_set_header Host $host有什么作用? upstream配置: 路由配置: 起初没有配置proxy_set_header Host $host等参数...
  • nginx之配置proxy_set_header

    千次阅读 2019-01-03 09:43:23
    nginx之配置proxy_set_header win10客户端请求web服务,win10的ip:192.168.223.1 nginx作为反向代理服务器:192.168.223.136 nginx作为后端web服务器:192.168.223.137 前提条件:配置nginx转发到后端服务器 ...
  • nginx之配置proxy_set_header(获取用户ip)

    千次阅读 2019-06-27 14:21:51
    nginx作为反向代理服务器:192.168.223.136 nginx作为后端web服务器:192.168.223.137 前提条件:配置nginx转发到后端服务器 server { listen 8080; server_name 192.168.223.136; location / { root "/ww...
  • 但是,nginx是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下: proxy_set_header X-real-ip ...
  • nginx 配置了反向代理后,接口访问一直400 proxy_pass http://imglib.xxx.xxxx.com;...proxy_set_header Host $host这一行的作用是把原http请求的Header中的Host字段也放到转发的请求里。 如果不加这一行的话,nginx...
  • Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义: proxy_...
  • Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义: ...
  • proxy_set_headernginx设置请求头给上游服务器,add_headernginx设置响应头信息给浏览器。 1.1 proxy_set_header 语法格式: proxy_set_header field value; value值可以是包含文本、变量或者它们的组合。 ...
  • proxy_set_header remote_header_test "123123123"; 接着后端真实服务器打开www.ttlsa.com/nginx_header.php 源代码是简单的phpinfo phpinfo(); ?> 在phpinfo结果页面中搜索刚才设置的头部,发现没有找到,...
  • 公司最近有一些反向代理的需求,需要将nginx部署在互联网DMZ区。 之前只有利用nginx做过简单的web服务器,并未真正在生产环境上使用反向代理。 本公司生产环境目前配置如下: [root@szweb01 conf]# cat nginx.conf ...
  • ###案例1 环境nginx,linux,tomcat 域名访问是走nginx给后端服务器处理的, ...那么问题肯定在nginx上无法处理headers的问题了, 经过查询上面资料得到是nginx的锅,hearders有下划线的锅,nginx设置underscores_in_...
  • 关于nginxproxy_set_header的设置

    万次阅读 2016-06-15 17:07:39
    昨天一个开发找我帮忙配置一个nginx的转发,本来很容易的配置,但是坑了我好久才解决。。。需求大致是: nginx上配有aaa.example.com的虚拟主机,现在需要将访问http://aaa.example.com/api/x.x/client/的请求转到...
  • 1.20 nginx正向代理 反向代理 新建一个虚拟主机 常用的DNS 地址查询: dns.lisect.com

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,154
精华内容 21,661
关键字:

nginxproxy_set_header