nginx: orden de resolución "nombre_servidor"?

8

Tengo múltiples bloques de "servidor" en mi nginx.conf. La documentación parece incorrecta sobre el orden en el que se realiza la coincidencia nombre_servidor.

Mi conf se parece a:

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
}

Estoy tratando de entender por qué las solicitudes con host = www.sub.domain.com van al lugar correcto (el segundo servidor), cuando la documentación indica que debería ir al primer servidor.

La documentación de Nginx indica que los bloques del servidor están marcados "en orden" para encontrar coincidencias, lo que significa que cualquier solicitud con el host * .sub.domain.com debe ser capturada por el primer servidor, no por el segundo servidor. ( http://wiki.nginx.org/HttpCoreModule#server_name )

Además, el comodín * coincide con cualquier número de partes de subdominio, por lo que * .dominio.com coincide con www.sub.domain.com. ( http://nginx.org/en/docs/http/server_names.html#wildcard_names )

Si esta documentación es incorrecta, ¿cuál es el orden de correspondencia real?

usuario41356
fuente

Respuestas:

18

De la documentación de nginx ( http://nginx.org/en/docs/http/server_names.html ):

Al buscar un servidor virtual por nombre, si el nombre coincide con más de una de las variantes especificadas, por ejemplo, el nombre comodín y la coincidencia de expresión regular, se elegirá la primera variante coincidente, en el siguiente orden de precedencia:

  1. nombre exacto
  2. nombre comodín más largo que comienza con un asterisco, por ejemplo, "* .example.org"
  3. el nombre comodín más largo que termina con un asterisco, por ejemplo, "mail. *"
  4. primera expresión regular coincidente (en orden de aparición en un archivo de configuración)
Justin L. Franks
fuente
2

La documentación dice:

Compara el encabezado Host de la solicitud HTTP entrante con los bloques del servidor {...} en los archivos de configuración de Nginx y selecciona el primero que coincide.

Lo que parece suceder es que elige la mejor coincidencia de todos los serverbloques, por lo que www.sub.domain.comcoincide con la segunda configuración. No tengo documentación para respaldar eso, por lo que puede ejecutar algunas pruebas para confirmar ese comportamiento. También existe este documento que habla sobre la resolución de nombres.

volcado de memoria
fuente