关于 nginx 中 proxy_pass 指令我有些疑惑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
21231sv

关于 nginx 中 proxy_pass 指令我有些疑惑

  •  
  •   21231sv 2023 年 8 月 9 日 1543 次点击
    这是一个创建于 981 天前的主题,其中的信息可能已经有所发展或是发生改变。
    upstream example { server 172.0.0.1:3000; server 172.0.0.2:3000; } server { listen 3000; server_name _; location / { proxy_pass http://example; proxy_ssl_verify off; proxy_set_header Host $http_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-Proto $scheme; } } 

    对于上面这个配置,我理解的是,假如客户端请求的是 http://ip:3000/path?a=1&b=2, nginx 会根据 example 这个 upstream 选择一个后端服务器转发请求,比如 http://172.0.0.1:3000/path?a=1&b=2

    但是我在工作中有碰到过如下配置:

     location ~ ^/api/(.*) { proxy_set_header Host $http_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-Proto $scheme; proxy_pass http://172.0.0.3:31081/$1$is_args$args; proxy_connect_timeout 300s; proxy_send_timeout 300s; proxy_read_timeout 300s; } 

    在这个配置中,proxy_pass 指令后面有 $is_args 、$args 这些参数。如果不加参数,客户端请求 url 上的参数就无法转发到 172.0.0.3 服务器上

    我想要的是要把客户端请求 url 中的参数转发到后端,我的疑惑是什么时候 proxy_pass 指令后面需要加 $is_args 、$args 这些参数

    11 条回复    2023-08-09 21:39:07 +08:00
    hankai17
        1
    hankai17  
       2023 年 8 月 9 日
    可能跟 upstream 模块有关
    yemoluo
        2
    yemoluo  
       2023 年 8 月 9 日
    看 172.0.0.3:31081 这台的 nginx 日志
    privil
        3
    privil  
       2023 年 8 月 9 日
    (.*) 这个参数在上下文里面不匹配 url 上的参数吧,话说用了那么多年 Nginx ,我也是第一次见第二种写法。直接去掉正则也可以吧。
    location ~ ^/api/ {
    proxy_set_header Host $http_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-Proto $scheme;
    proxy_pass http://172.0.0.3:31081/;
    proxy_connect_timeout 300s;
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    }
    crystom
        4
    crystom  
       2023 年 8 月 9 日
    很可能跟末尾有没有斜杠有关系
    dzdh
        5
    dzdh  
       2023 年 8 月 9 日
    proxy_pass 到 127.0.0.1:xx 然后看日志
    xiangyuecn
        6
    xiangyuecn  
       2023 年 8 月 9 日
    按道理,第二种才是正常写法。

    第一种写多了,只会误导人,来个高级一点的就不会写了。
    wu00
        7
    wu00  
       2023 年 8 月 9 日
    @privil 应该做了一层 path strip 吧? /api/xxx => /xxx , 你这个/api/前缀带到服务层就 404 了
    privil
        8
    privil  
       2023 年 8 月 9 日
    @wu00 #7 你可以试试我这种写法会不会带过去。我看漏了中间一堆他自己的理解,啥理解,多个 upsteam 是有个默认算法的请求的。脑补严重。
    jifengg
        9
    jifengg  
       2023 年 8 月 9 日
    以我有限的 nginx 经验,楼主的第二个配置
    location ~ ^/api/(.*) {
    proxy_pass http://172.0.0.3:31081/$1$is_args$args;
    }
    的目的,是把类似 http://host/api/your/path?key=value 转发到 http://172.0.0.3:31081/your/path?key=value

    是把“/api”这层 path 换成“/”,应该是 172.0.0.3:31081 的 api (?)服务不需要加 “/api”前缀。

    $1 就是 location 正则里面的 第一个 group ,$is_args 是表示是否有 searchPath ,值是"?"或空,$args 则表示 key=value&a=b 这整个 get 参数。

    有个简化的版本可以参考(也是达到“转发时去掉 url 中的/api 的目的”):
    location /api {
    proxy_pass http://172.0.0.3:31081/; #注意这里最后的/不能省
    }
    21231sv
        10
    21231sv  
    OP
       2023 年 8 月 9 日
    @xiangyuecn #6 为什么这么说?我看官网上都是第一种写法
    21231sv
        11
    21231sv  
    OP
       2023 年 8 月 9 日
    @jifengg #9 这么说,我上次应该就是省略了 31081 后面的 /
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3879 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 67ms UTC 10:27 PVG 18:27 LAX 03:27 JFK 06:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86