Esta configuração nginx funciona para mim:
location /foo/ {
proxy_pass http://a.bar.mesos/;
}
Observe que o seletor location
e o valor proxy_pass
são URIs. Então, você sabe, isso afeta como a URL é reescrita para o servidor upstream. Por exemplo, http://.../foo/bar
é reescrito para http://a.bar.mesos/bar
. Se o valor proxy_pass
fosse http://a.bar.mesos
sem a barra final, o URL seria reescrito como http://a.bar.mesos/foo/bar
, o que é incorreto para mim.
Como você também deve saber, se a.bar.mesos
não puder ser resolvido na hora de início do nginx, o nginx não será iniciado. Uma maneira de contornar isso é mencionada em outras perguntas neste site e é usar uma diretiva resolver
e uma variável como esta:
location /foo/ {
resolver 127.0.0.1;
set $a_bar_mesos a.bar.mesos;
proxy_pass http://$a_bar_mesos/;
}
Na verdade, isso resolve o problema de o nginx não iniciar com um nome de host não resolvido, mas também faz com que o nginx não reconheça mais que o valor
proxy_pass
tem um URI e, portanto, a regravação de URL se torna incorreta para mim. Ou seja, use as regras de regravação associadas a um valor
proxy_pass
de
http://a.bar.mesos
em vez de
http://a.bar.mesos/
.
A minha pergunta é, alguém sabe como iniciar o nginx com nomes de host não resolvidos e obter as regras de reescrita de URL URI / URI?
Então, você sabe o meu caso de uso, eu uso o Mesos para lançar programas em um cluster de máquinas. Os programas têm nomes conhecidos como a.bar
. Eu uso mesos-dns
para associar o nome do programa a.bar
com o hostname a.bar.mesos
e o endereço IP da máquina que Mesos atribuiu a ele. Quando o programa não está em execução, mesos-dns
remove o nome a.bar.mesos
de seu registro. Eu uso nginx para encaminhar solicitações HTTP para o programa através da configuração acima. Quando estou reiniciando o servidor que hospeda o nginx, não há garantia de que todos os programas com proxy serão instalados e funcionando.