我希望我的 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

  • 1
    1)如果没有定义就无法工作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 配置本身。但我怎样才能让你的答案被接受呢?


    –