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

2023-06-21 09:08:58 +08:00
 swordne
有一个需求:
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
2053 次点击
所在节点    问与答
12 条回复
taofoo
2023-06-21 09:14:37 +08:00
如果就这几个端口的话,location 就可以
nitmali
2023-06-21 09:18:31 +08:00
location ^~ /10111/
LLaMA2
2023-06-21 09:18:49 +08:00
location 中有路径,匹配到转发不同的端口,和楼上说的一样
swordne
2023-06-21 09:34:53 +08:00
@taofoo #1 不是,以后会有很多。想找个方法让 nginx 根据路由上的端口号自动转发到对应的本地,这样就可以让组内的小伙伴自由的起服务,我就不去动 nginx 配置了。
swordne
2023-06-21 09:35:32 +08:00
@nitmali #2 端口号是可变、随机的。
xiaokanhongchen
2023-06-21 09:40:12 +08:00
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
2023-06-21 09:41:02 +08:00
自己试试,稍微改改就行
swordne
2023-06-21 10:19:28 +08:00
@xiaokanhongchen #7 我来试试,之前也搜过这种答案,貌似不行,看看是不是有哪里不一样。
XiFanL1
2023-06-21 10:26:48 +08:00
完全动态的话会不会有安全风险,一些仅对内网开放端口是不是也可以通过这种方式访问
swordne
2023-06-21 10:32:32 +08:00
@XiFanL1 #9 不好,1 是测试服务器,2 是开放的全部是 hyperf 的项目转发端口,3 是其实主要是省事,要不天天去服务器上弄太麻烦了,也有安全隐患。
xixibb
2023-06-21 17:38:56 +08:00
@xiaokanhongchen #6 哥,真的假的,GPT 这么牛逼了吗?
swordne
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;
}

这样配置就可以完成转发了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/950520

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX