Wildcard vhosts di Nginx

25

Saya baru saja menginstal Nginx di server saya dan saya sangat senang dengan hasilnya, namun saya masih tidak tahu bagaimana cara memasukkan host virtual wildcard.

Ini adalah struktur [direktori] yang saya inginkan:

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

Seperti yang Anda lihat, ini cukup mendasar, saya ingin kemampuan untuk menambahkan domain dengan hanya menambahkan catatan A untuk subdomain baru, yang akan langsung menunjuk ke subdirektori dengan nama yang sama di bawah public_html.

Ada hal-hal di web, namun saya belum menemukan sesuatu yang persis seperti ini.

Bantuan apa pun akan sangat dihargai.

Rorygilchrist
sumber
Saya tidak yakin apa yang Anda maksud dengan "subdirektori dengan nama yang sama" ketika contoh Anda memiliki dua nama yang berbeda: subdomain 1/ x.example.com- bisakah Anda mengklarifikasi?
jemaah
Benar, tidak terlalu jelas maaf. Katakanlah saya memiliki subdomain x.example.com, direktori itu adalah / public_html / x, namun saya membutuhkan example.com dan www.example.com untuk menunjuk ke / public_html /
rorygilchrist

Jawaban:

39

Saya akan tunjukkan.

File konfigurasi

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

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

File uji

Kami memiliki dua file uji:

$ cat www/pub/index.html 
COMMON

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

Pengujian

Nama server statis:

$ 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

Dan nama server 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
sumber
Sayangnya tidak bekerja. Semua subdomain hanya menunjuk ke public_html. Berikut ini adalah konfigurasi server kedua: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
"Sayangnya tidak berfungsi" tidak memberikan detail. Lihat selalu ke nginx error.log untuk detailnya. Saya telah memperbarui jawaban saya untuk menunjukkan kepada Anda bagaimana konfigurasi ini bekerja. Anda dapat melihat versi Nginx saya adalah 0.8.54
Alexander Azarov
Baru saja bekerja dengan baik untukku.
Claire Furney
5

File konfigurasi Nginx di bawah ini memungkinkan nama host wildcard yang secara dinamis merutekan ke folder yang sesuai /var/www/vhost/sementara juga secara dinamis menghasilkan file log masing-masing.

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
sumber
Tolong jelaskan solusi Anda.
Andrew Schulman
Tampaknya ini hampir identik dengan jawaban yang ada. Apa yang ini tambahkan?
Michael Hampton
1
Memberikan sedikit lebih banyak kekhususan. Semoga ini bisa membantu semua orang.
AnthumChris