我希望我的 nginx docker 能够使用一个简单的配置动态地进行 proxy_pass。
我目前在三个应用程序中使用了此配置,但我想使其动态工作,以便我也可以将它与 /xyz_987 一起使用,它会自动传递到 http://xyz_987:3000:
server {
listen 3000;
server_name _;
location /user1/ {
proxy_pass http://user1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location /user2/ {
proxy_pass http://user2:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location /user3/ {
proxy_pass http://user3:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
我尝试过这个但总是导致 502 Bad Gateway:
server {
listen 3000;
server_name _;
location ~ ^/(?<username>[\w]+)/ {
proxy_pass http://$username:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
# Fallback for root path
location / {
return 404;
}
}
最佳答案
1
尝试一下:
location ~ ^/(user[a-z0-9]+)/ {
proxy_pass http://$1:3000;
...
}
指定~
与 Perl 兼容的正则表达式匹配。然后,我们匹配以 开头的字符串user
,以及任何数字或字母,并将其捕获到$1
变量中。
我们不能在这里允许所有角色,因为这会使服务器成为一个开放代理,恶意的人会利用它来攻击不同的目标。
4
-
11)如果没有定义就无法工作
resolver
(通常127.0.0.11
通过 docker 内部 DNS 解析容器名称)2)根据 OP 的要求,正则表达式应该只是^/([\w]+)/
3)对于这种情况,我宁愿使用命名捕获。
– -
由于 nginx 也作为 docker 运行,因此无需定义解析器即可进行解析。但我就是无法让动态部分工作。我现在尝试的是:(我将代码放在我的问题中,因为 smh 我无法在评论中使用代码块)但它将始终是 502 Bad Gateway
–
-
嗯,似乎在动态配置上需要解析器..但它不起作用..:[错误] 31#31:解析时 send()失败(111:连接被拒绝),解析器:127.0.0.11:53
– -
@IvanShatsky 实际上这可行,但我需要有一个自定义网络,所以我只需要更改我的 docker 配置本身。但我怎样才能让你的答案被接受呢?
–
|
|