nginx: ordem de resolução "server_name"?

8

Eu tenho vários blocos de "servidor" no meu nginx.conf. A documentação parece errada sobre a ordem na qual a correspondência server_name ocorre.

Meu conf é algo como:

server {
  listen 80
  server_name domain.com *.domain.com

  # do stuff
}

server {
  listen 80
  server_name sub.domain.com *.sub.domain.com

  # do something else
}

Estou tentando descobrir por que as solicitações com host = www.sub.domain.com estão indo para o local correto (o segundo servidor), quando a documentação indica que deveria estar indo para o primeiro servidor.

A documentação do Nginx indica que os blocos do servidor são verificados "em ordem" para correspondências, o que significa que qualquer solicitação com o host * .sub.domain.com deve ser capturada pelo primeiro servidor, não pelo segundo servidor. ( http://wiki.nginx.org/HttpCoreModule#server_name )

Além disso, o curinga * corresponde a qualquer número de partes do subdomínio; portanto, * .domain.com corresponde a www.sub.domain.com. ( http://nginx.org/en/docs/http/server_names.html#wildcard_names )

Se esta documentação estiver incorreta, qual é a ordem de correspondência real?

user41356
fonte

Respostas:

18

Na documentação do nginx ( http://nginx.org/en/docs/http/server_names.html ):

Ao procurar um servidor virtual por nome, se o nome corresponder a mais de uma das variantes especificadas, por exemplo, nome curinga e correspondência de expressão regular, a primeira variante correspondente será escolhida, na seguinte ordem de precedência:

  1. nome exato
  2. nome curinga mais longo, começando com um asterisco, por exemplo, "* .example.org"
  3. o nome mais curinga que termina com um asterisco, por exemplo, "mail. *"
  4. primeira expressão regular correspondente (em ordem de aparência em um arquivo de configuração)
Justin L. Franks
fonte
2

A documentação diz:

Compara o cabeçalho Host da solicitação HTTP recebida com os blocos do servidor {...} nos arquivos de configuração do Nginx e seleciona o primeiro que corresponder.

O que parece acontecer é que ele escolhe a melhor correspondência de todos os serverblocos www.sub.domain.com, correspondendo à segunda configuração. Como não tenho documentação para fazer backup, você pode executar alguns testes para confirmar esse comportamento. Há também este documento falando sobre resolução de nomes.

coredump
fonte