我希望我的 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;
}
}
您想出的配置几乎是正确的。您唯一遗漏的是一个
resolver
指令,当您的代理主机名通过变量指定时需要该指令。您可能会问,为什么 nginx 不使用主机的 DNS 功能?这里有一个很好的解释:要使用 docker 内部 DNS,您需要使用用户定义网络(请参阅网络概述 - 用户定义网络、使用独立容器联网 - 使用用户定义桥接网络文档页面)。我推荐的另一篇文章是了解 Docker DNS。Docker守护程序的嵌入式 DNS 解析器默认侦听 IP 地址 127.0.0.11,因此您需要将 nginx 配置更改为
并确保您的 docker 容器使用用户定义的网络。
尝试一下:
指定与 Perl 兼容的正则表达式匹配。然后,我们匹配以和任何数字或字母
~
开头的字符串,并将其捕获到变量中。user
$1
我们不能在这里允许所有角色,因为这会使服务器成为一个开放代理,恶意的人会利用它来攻击不同的目标。