Wildcard vhosts na Nginx

25

Właśnie zainstalowałem Nginx na moim serwerze i jestem bardzo zadowolony z wyników, jednak nadal nie mogę wymyślić, jak wstawić wirtualne hosty z symbolami wieloznacznymi.

Oto struktura [katalogu], którą chciałbym:

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

Jak widać, jest to dość proste, jednak chciałbym mieć możliwość dodawania domen po prostu przez dodanie rekordu A dla nowej subdomeny, która natychmiast wskaże podkatalog o tej samej nazwie pod public_html.

W sieci są rzeczy, jednak nie spotkałem czegoś takiego.

Każda pomoc byłaby bardzo mile widziana.

rorygilchrist
źródło
Nie jestem pewien, co rozumiesz przez „podkatalog o tej samej nazwie”, gdy twój przykład ma dwie różne nazwy: subdomain 1/ x.example.com- czy możesz to wyjaśnić?
nickgrim
Prawda, niezupełnie przepraszam. Powiedzmy, że mam subdomenę x.example.com, jej katalog to / public_html / x, jednak potrzebuję zarówno example.com, jak i www.example.com, aby wskazać / public_html /
rorygilchrist

Odpowiedzi:

39

Pokażę ci.

Plik konfiguracyjny

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

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

Testuj pliki

Mamy dwa pliki testowe:

$ cat www/pub/index.html 
COMMON

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

Testowanie

Statyczne nazwy serwerów:

$ 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

I nazwa serwera wyrażenia regularnego:

$ 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
Aleksander Azarow
źródło
Niestety nie działa Wszystkie subdomeny wskazują tylko public_html. Oto druga konfiguracja serwera: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
4
„nie działa niestety” niestety nie podaje żadnych szczegółów. Zawsze sprawdź szczegóły w pliku nginx error.log. Zaktualizowałem moją odpowiedź, aby pokazać, jak działa ta konfiguracja. Możesz zobaczyć, że moja wersja Nginx to 0.8.54
Alexander
Właśnie działało dla mnie idealnie.
Claire Furney
5

Poniższy plik konfiguracyjny Nginx pozwala na stosowanie nazw wieloznacznych, które dynamicznie kierują do odpowiedniego folderu, /var/www/vhost/a jednocześnie dynamicznie generują odpowiednie pliki dziennika.

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
źródło
Proszę wyjaśnić swoje rozwiązanie.
Andrew Schulman
To wydaje się być praktycznie identyczne z istniejącą odpowiedzią. Co to dodaje?
Michael Hampton
1
Zapewnia nieco więcej specyficzności. Mam nadzieję, że to pomoże wszystkim.
AnthumChris