求教一个 nginx 的动态端口转发写法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
swordne
V2EX    问与答

求教一个 nginx 的动态端口转发写法

  •  
  •   swordne 2023-06-21 09:08:58 +08:00 2592 次点击
    这是一个创建于 850 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个需求:
    a.b.com/10111/xxxxx
    a.b.com/10112/xxxxx
    a.b.com/10113/xxxxx

    nginx 需要根据里面的 10111/10112/10113 对应转发到:
    0.0.0.0:10111/0.0.0.0:10112/0.0.0.0:10113 上面,对应的 hyperf 服务。
    需要将 pathinfo 里的端口号获取然后自动转发到本机的端口里,nginx 能够实现么?

    因为多人测试共用一台服务器,每次新建项目都要手动配置,很麻烦,如果能够从 nginx 原生实现那么就不用单独去弄个管理器了。

    恳请大佬们赐教。T.T
    12 条回复    2023-06-21 17:43:32 +08:00
    taofoo
        1
    taofoo  
       2023-06-21 09:14:37 +08:00
    如果就这几个端口的话,location 就可以
    nitmali
        2
    nitmali  
       2023-06-21 09:18:31 +08:00
    location ^~ /10111/
    LLaMA2
        3
    LLaMA2  
       2023-06-21 09:18:49 +08:00
    location 中有路径,匹配到转发不同的端口,和楼上说的一样
    swordne
        4
    swordne  
    OP
       2023-06-21 09:34:53 +08:00
    @taofoo #1 不是,以后会有很多。想找个方法让 nginx 根据路由上的端口号自动转发到对应的本地,这样就可以让组内的小伙伴自由的起服务,我就不去动 nginx 配置了。
    swordne
        5
    swordne  
    OP
       2023-06-21 09:35:32 +08:00
    @nitmali #2 端口号是可变、随机的。
    xiaokanhongchen
        6
    xiaokanhongchen  
       2023-06-21 09:40:12 +08:00 via Android
    chatgpt 帮你实现了,转:
    是的,Nginx 可以实现这样的需求。您可以使用 Nginx 的反向代理和重写规则来实现将请求转发到相应的 Hyperf 服务的功能。

    首先,您需要在 Nginx 的配置文件中设置反向代理规则,并根据请求的路径重写 URL 。以下是一个示例配置:
    ```
    server {
    listen 80;
    server_name a.b.com;

    location / {
    rewrite ^/(\d+)/(.*)$ /$2 break;
    proxy_pass http//0.0.0.0:$1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    }
    }
    ```
    在这个配置中,正则表达式^/(\d+)/(.*)$会匹配类似于 /10111/xxxxx 的 URL 路径,并将 10111 提取出来作为参数。然后,rewrite 指令将路径重写为 /$2 ,其中$2 是匹配到的第二个组(即 xxxxx 部分)。接下来,proxy_pass 指令将请求代理到 http://0.0.0.0:$1 ,其中$1 是第一个组(即提取的端口号)。最后,proxy_set_header 指令设置一些代理请求的头部信息。

    请根据您的实际环境进行适当的修改,包括监听的端口号、服务器名称和 Hyperf 服务的地址。完成配置后,重新加载 Nginx 配置并启动服务,Nginx 将根据请求中的端口号将请求转发到相应的 Hyperf 服务上。
    xiaokanhongchen
        7
    xiaokanhongchen  
       2023-06-21 09:41:02 +08:00 via Android
    自己试试,稍微改改就行
    swordne
        8
    swordne  
    OP
       2023-06-21 10:19:28 +08:00
    @xiaokanhongchen #7 我来试试,之前也搜过这种答案,貌似不行,看看是不是有哪里不一样。
    XiFanL1
        9
    XiFanL1  
       2023-06-21 10:26:48 +08:00
    完全动态的话会不会有安全风险,一些仅对内网开放端口是不是也可以通过这种方式访问
    swordne
        10
    swordne  
    OP
       2023-06-21 10:32:32 +08:00
    @XiFanL1 #9 不好,1 是测试服务器,2 是开放的全部是 hyperf 的项目转发端口,3 是其实主要是省事,要不天天去服务器上弄太麻烦了,也有安全隐患。
    JZ8ZW193q6W9Awgy
        11
    JZ8ZW193q6W9Awgy  
       2023-06-21 17:38:56 +08:00
    @xiaokanhongchen #6 哥,真的假的,GPT 这么牛逼了吗?
    swordne
        12
    swordne  
    OP
       2023-06-21 17:43:32 +08:00
    已经可以了
    location /api/ {

    set $uri_parts '';
    if ($uri ~ "^/(?<uri_part1>[^/]+)/(?<uri_part2>[^/]+)/(?<param>.*)$") {
    set $uri_parts $uri_part1,$uri_part2;
    }

    proxy_pass http://0.0.0.0:$uri_part2/$param;
    }

    这样配置就可以完成转发了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2693 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 04:15 PVG 12:15 LAX 21:15 JFK 00:15
    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