inicia o nginx quando o servidor upstream não pode ser resolvido e ainda tem as regras de reescrita URI / URI do proxy_pass?

1

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.

    
por mab 08.09.2016 / 19:38

1 resposta

0

Você pode implementar a regra de reconfiguração de URI / URI usando rewrite ... break dentro do mesmo local, em vez de usar proxy_pass para fazer isso para você:

location /foo/ {
    resolver 127.0.0.1;
    set $a_bar_mesos a.bar.mesos;

    rewrite ^/foo(.*)$ $1 break;
    proxy_pass http://$a_bar_mesos;
}

Veja este documento para detalhes.

    
por 08.09.2016 / 23:14

Tags