Quero que meu docker nginx seja capaz de fazer proxy_pass dinamicamente, de qualquer forma, usando uma configuração simples.
Atualmente, uso essa configuração para três aplicativos, mas gostaria de fazê-la funcionar dinamicamente para que eu também pudesse usá-la com /xyz_987, que passa automaticamente para 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;
}
}
Eu tentei isso, mas sempre resulta em um 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;
}
}
A configuração que você criou está quase correta. A única coisa que você esqueceu foi uma
resolver
diretiva, que é necessária quando seu nome de host proxy é especificado via variável(eis). Você pode perguntar, por que o nginx não usaria o recurso DNS do host? Aqui está uma explicação muito boa:Para usar o DNS interno do docker, você precisa usar a rede definida pelo usuário (veja Visão geral de rede - Redes definidas pelo usuário , Rede com contêineres autônomos - Use redes de ponte definidas pelo usuário páginas de documentação). Outro artigo que posso recomendar é Entendendo o DNS do Docker . O resolvedor DNS incorporado do daemon do Docker escuta no endereço IP 127.0.0.11 por padrão, então você precisa alterar sua configuração nginx para
e garanta que seus contêineres docker usem a rede definida pelo usuário.
Experimente isto:
O
~
especifica uma correspondência de expressão regular compatível com Perl. Então, nós correspondemos a string que começa comuser
e quaisquer números ou letras, e capturamos isso na$1
variável.Não podemos permitir todos os caracteres aqui, porque isso tornaria o servidor um proxy aberto que pessoas mal-intencionadas usariam para atacar diferentes alvos.