Jalur root domain nginx dinamis berdasarkan nama host?

11

Saya mencoba mengatur pengembangan nginx / PHP server saya dengan konfigurasi dasar master / catch-all vhost sehingga saya dapat membuat ___.framework.locdomain tanpa batas sesuai kebutuhan.

server {
        listen 80;
        index index.html index.htm index.php;

        # Test 1
        server_name ~^(.+)\.frameworks\.loc$;
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;

        include /etc/nginx/php.conf;
}

Namun, nginx merespons dengan kesalahan 404 untuk pengaturan ini. Saya tahu nginx dan PHP berfungsi dan memiliki izin karena localhostkonfigurasi yang saya gunakan berfungsi dengan baik.

server {
        listen 80 default;
        server_name localhost;
        root /var/www/localhost;
        index index.html index.htm index.php;

        include /etc/nginx/php.conf;
}

Apa yang harus saya periksa untuk menemukan masalah? Ini adalah salinan dari php.conf yang mereka muat.

location / {
        try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {

        try_files $uri =404;

        include fastcgi_params;
        fastcgi_index index.php;

        # Keep these parameters for compatibility with old PHP scripts using them.
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # Some default config
        fastcgi_connect_timeout        20;
        fastcgi_send_timeout          180;
        fastcgi_read_timeout          180;
        fastcgi_buffer_size          128k;
        fastcgi_buffers            4 256k;
        fastcgi_busy_buffers_size    256k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors    on;
        fastcgi_ignore_client_abort off;
        fastcgi_pass 127.0.0.1:9000;

}
Xeoncross
sumber

Jawaban:

12

Mengapa tidak menggunakan saja:

server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;
Michael Hampton
sumber
Inilah yang saya cari!
Xeoncross
13

Konfigurasi nginx bukan program, ini adalah deklarasi. Ketika Anda menggunakan konfigurasi seperti ini:

server {
        server_name ~^(.+)\.frameworks\.loc$;
        ...
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;
}

Tidak ada cara untuk memastikan bahwa setarahan Anda akan dijalankan sebelumnya root.

Tapi ada trik dengan maparahan yang saya suka gunakan. Itu bergantung pada fakta yang mapdievaluasi sebelumnyalocation

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}
DukeLion
sumber
Ini terlihat menyenangkan, saya berencana bermain lebih banyak dengan peta sekarang. Saya juga tidak menyadari bahwa file konfigurasi tidak diproses secara linear.
Xeoncross
Apa gunanya di $mypathsini? Itu tidak digunakan di mana pun.
kodeart
@kodeart $mypathadalah grup hasil untuk regex ~^(.?<mypath>+)\.frameworks\.loc$dan $rootpathmerupakan hasil untuk seluruh trik peta.
Fabio Montefuscolo
4

Selain jawaban DukeLion yang hebat , saya perlu mengubah jalur

~^(.?<mypath>+)\.frameworks\.loc$ $mypath;

untuk

~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;

dalam /etc/nginx/nginx.conffile saya seperti yang disarankan di sini .

Menambahkan

root /var/www/frameworks/$rootpath

di /etc/nginx/sites-available/defaultbekerja dengan baik setelah itu.

zub0r
sumber
0

Mungkin Anda bisa melihat lighttpd juga. Ini telah membangun dukungan untuk apa yang Anda minta di sini. Itu adalah panggilan mod_evhost .

Aktifkan evhost

Tambahkan baris berikut ke lighttpd.conf Anda. Jika Anda menggunakan distribusi basis Debian / Ubuntu, cukup tautan lunak atau salin dari /etc/lighttpd/conf-available/10-evhost.confke /etc/lighttpd/conf-enabled/.

    # http://redmine.lighttpd.net/wiki/1/Docs:ModEVhost
    server.modules + = ("mod_evhost")
    evhost.path-pattern = "/ home / www /% _"

The %_(wildcard) di sarana evhost.path-Patten menggunakan nama domain lengkap (misalnya. Www.example.com). Permintaan untuk www.example.com akan secara otomatis mengarah ke root-dokumen /home/www/www.example.com/.

Menambahkan situs tambahan semudah membuat direktori lain /home/wwwdengan nama domain lengkap. Tidak ada perubahan ke file konfigurasi Lighttpd.

Ada wildcard lain dan dapat digunakan untuk membangun struktur direktori. Mereka adalah sebagai berikut

    %% =>% tanda
    % 0 => nama domain + tld
    % 1 => tld
    % 2 => nama domain tanpa tld
    % 3 => nama subdomain 1
    % 4 => nama subdomain 2
    % _ => nama domain lengkap

Informasi detail ada di sini .

PS: Mengaktifkan PHP juga mudah jika Anda menggunakan platform debian / ubuntu. Cukup aktifkan 10-fastcgi.confdan 15-fastcgi-php.conf.

John Siu
sumber
0

NGINX menggunakan pustaka ekspresi reguler PCRE.
Pada NGINX v0.8.25 server_namedirektif memungkinkan penangkapan bernama .

Tangkapan yang dinamai dalam ekspresi reguler membuat variabel ( 0.8.25 ) yang nantinya dapat digunakan dalam arahan lain Saat menggunakan kurung bernama, NGINX secara otomatis menetapkan variabel untuk setiap kurung bernama, selama evaluasi nama server (saya kira).

Saya menggunakan cuplikan berikut untuk "memagari" lingkungan pengembang. «Pengguna» mengacu pada nama pengguna mereka dan «proyek» proyek tempat mereka bekerja:

# ...
server_name ~^(?<user>[^.]+)\.(?<proj>[^.]+).dev.local-server.com;
root /home/$user/www/$proj;
# ...

Perhatikan bahwa konfigurasi nginx bersifat deklaratif, dan dengan demikian, deklarasi statis mungkin selalu lebih cepat dibandingkan dengan nilai dan variabel yang dihitung run-time. Evaluasi ekspresi reguler relatif mahal, saya kira itu harus digunakan dengan kekikiran di lingkungan (produksi) yang sarat muatan.

Stphane
sumber