Vhosts comodín en Nginx

25

Acabo de instalar Nginx en mi servidor y estoy extremadamente contento con los resultados, sin embargo, todavía no puedo entender cómo insertar hosts virtuales comodín.

Esta es la estructura [directorio] que me gustaría:

-- public_html (example.com)
---subdoamin 1 (x.example.com)
---subdomain 2 (y.example.com)

Como puede ver, es bastante básico, sin embargo, me gustaría poder agregar dominios simplemente agregando un registro A para un nuevo subdominio, que apuntará instantáneamente al subdirectorio del mismo nombre en public_html.

Hay cosas en la web, sin embargo, no he encontrado algo exactamente como esto.

Cualquier ayuda sería muy apreciada.

rorygilchrist
fuente
No estoy seguro de lo que quiere decir con "subdirectorio del mismo nombre" cuando su ejemplo tiene dos nombres diferentes: subdomain 1/ x.example.com- ¿Puede aclarar?
nickgrim
Es cierto, no muy claro lo siento. Digamos que tengo el subdominio x.example.com, su directorio sería / public_html / x, sin embargo, necesito ambos example.com y www.example.com para señalar / public_html /
rorygilchrist

Respuestas:

39

Te lo mostraré.

El archivo de configuración

server {
  server_name example.com www.example.com;
  root www/pub;
}

server {
  server_name ~^(.*)\.example\.com$ ;
  root www/pub/$1;
}

Archivos de prueba

Tenemos dos archivos de prueba:

$ cat www/pub/index.html 
COMMON

$ cat www/pub/t/index.html 
T

Pruebas

Nombres de servidor estático:

$ curl -i -H 'Host: example.com' http://localhost/
HTTP/1.1 200 OK
Server: nginx/0.8.54
Date: Wed, 23 Mar 2011 08:00:42 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Wed, 23 Mar 2011 07:56:24 GMT
Connection: keep-alive
Accept-Ranges: bytes

COMMON

$ curl -i -H 'Host: www.example.com' http://localhost/
HTTP/1.1 200 OK
Server: nginx/0.8.54
Date: Wed, 23 Mar 2011 08:00:48 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Wed, 23 Mar 2011 07:56:24 GMT
Connection: keep-alive
Accept-Ranges: bytes

COMMON

Y el nombre del servidor regexp:

$ curl -i -H 'Host: t.example.com' http://localhost/
HTTP/1.1 200 OK
Server: nginx/0.8.54
Date: Wed, 23 Mar 2011 08:00:54 GMT
Content-Type: text/html
Content-Length: 2
Last-Modified: Wed, 23 Mar 2011 07:56:40 GMT
Connection: keep-alive
Accept-Ranges: bytes

T
Alexander Azarov
fuente
Desafortunadamente no funciona. Todos los subdominios solo apuntan a public_html. Aquí está la segunda configuración del servidor:server{ listen 80; server_name ~^(.*)\.example\.com$ ; location / { root /var/www/public_html/$1; index index.html index.htm index.php; } location ~ \.php$ { root $1; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/public_html/$1$fastcgi_script_name; include fastcgi_params; } }
rorygilchrist
44
"no funciona desafortunadamente" no da detalles desafortunadamente. Siempre busque en nginx error.log para más detalles. He actualizado mi respuesta para mostrarle cómo funciona esta configuración. Puedes ver que mi versión de Nginx es 0.8.54
Alexander Azarov
Funcionó perfectamente para mí en este momento.
Claire Furney
5

Este archivo de configuración de Nginx a continuación permite nombres de host comodín que se enrutan dinámicamente a la carpeta correspondiente /var/www/vhost/mientras que también generan dinámicamente los archivos de registro respectivos.

http://test1.wildcard.com/var/www/vhost/test1
                                                   /var/log/nginx/test1.wildcard.com-access.log                                                    /var/log/nginx/test1.wildcard.com-error.log

http://test2.wildcard.com/var/www/vhost/test2
                                                   /var/log/nginx/test2.wildcard.com-access.log                                                    /var/log/nginx/test2.wildcard.com-error.log

wildcard.conf

server {
  listen 80;
  listen [::]:80;

  #  Match everything except dot and store in $subdomain variable
  #  Matches test1.wildcard.com, test1-demo.wildcard.com
  #  Ignores sub2.test1.wildcard.com
  server_name ~^(?<subdomain>[^.]+).wildcard.com;

  root /var/www/vhost/$subdomain;

  access_log /var/log/nginx/$host-access.log;
  error_log  /var/log/nginx/$host-error.log;
}
AnthumChris
fuente
Por favor explique su solución.
Andrew Schulman
Esto parece ser prácticamente idéntico a una respuesta existente. ¿Qué agrega esto?
Michael Hampton
1
Proporciona un poco más de especificidad. Espero que ayude a todos.
AnthumChris