Ana bilgisayar adına dayalı dinamik nginx etki alanı kök yolu?


11

Gerektiğinde sınırsız ___.framework.locetki alanı oluşturabilmem için temel bir master / catch-all vhost config ile geliştirme nginx / PHP sunucumu kurmaya çalışıyorum .

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;
}

Ancak, nginx bu kurulum için bir 404 hatasıyla yanıt verir. Ben nginx ve PHP çalışıyorum biliyorum ve localhostkullandığım yapılandırma iyi çalışıyor çünkü izin var .

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

        include /etc/nginx/php.conf;
}

Sorunu bulmak için neleri kontrol etmeliyim? Her ikisi de yüklüyor php.conf bir kopyası.

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;

}

Yanıtlar:


12

Neden sadece kullanmıyorsunuz:

server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;

Aradığım şey buydu!
Xeoncross

13

Nginx config bir program değil, bir bildiridir. Böyle bir yapılandırma kullanırken:

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

setDirektifinizin daha önce yürütülmesini sağlamanın bir yolu yoktur root.

Ama mapkullanmak istediğim direktifin bir hilesi var . Daha mapönce değerlendirilen gerçeğe dayanırlocation

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}

Bu eğlenceli görünüyor, şimdi harita ile daha fazla oynamayı planlıyorum. Ayrıca yapılandırma dosyalarının doğrusal bir şekilde işlenmediğinin farkında değildim.
Xeoncross

Burada ne var $mypath? Hiçbir yerde kullanılmaz.
kodeart

@kodeart $mypathnormal ifadenin sonuç grubudur ~^(.?<mypath>+)\.frameworks\.loc$ve $rootpathtüm harita numarasının sonucudur.
Fabio Montefuscolo

4

Harika DukeLion'un cevabına ek olarak , hattı değiştirmem gerekiyordu

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

için

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

Benim de /etc/nginx/nginx.confdosyaya önerildiği gibi burada .

Ekleme

root /var/www/frameworks/$rootpath

içinde /etc/nginx/sites-available/defaultbundan sonra cezayı çalıştı.


0

Belki lighttpd'ye de bakabilirsiniz. Tam olarak burada sorduğunuz şeyleri destekliyor. Mod_evhost'u çağırır .

Evhost'u etkinleştir

Lighttpd.conf dosyasına aşağıdaki satırları ekleyin. Eğer Debian / Ubuntu baz dağılımı, sadece yumuşak bağlantıyı kullanarak ya kopyalamak ise /etc/lighttpd/conf-available/10-evhost.confhiç /etc/lighttpd/conf-enabled/.

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

%_Evhost.path-patten içindeki (joker karakter), tam alan adını (ör. Www.example.com) kullanmak anlamına gelir. Www.example.com isteği otomatik olarak belge köküne yönlendirilir /home/www/www.example.com/.

Ek site eklemek /home/www, tam alan adıyla başka bir dizin oluşturmak kadar kolaydır . Lighttpd yapılandırma dosyasında değişiklik yok.

Başka joker karakterler vardır ve dizin yapısını oluşturmak için kullanılabilir. Onlar aşağıdaki gibidir

    %% =>% işareti
    % 0 => alan adı + tld
    % 1 => tld
    % 2 => tld içermeyen alan adı
    % 3 => alt alan adı 1 adı
    % 4 => alt alan adı 2 adı
    % _ => tam alan adı

Ayrıntılı bilgi burada .

Not: debian / ubuntu platformundaysanız PHP'yi etkinleştirmek de kolaydır. Sadece etkinleştirin 10-fastcgi.confve 15-fastcgi-php.conf.


0

NGINX, PCRE normal ifade kütüphanesini kullanır.
NGINX v0.8.25 server_nameyönergesi ile belirtilen yakalamalara izin verilmektedir .

Düzenli ifadelerdeki adlandırılmış yakalamalar , daha sonra diğer yönergelerde kullanılabilecek değişkenler ( 0.8.25 ) oluşturur. Adlandırılmış parantez kullanılırken, NGINX, sunucu adlarının değerlendirilmesi sırasında her adlandırılmış parantez için otomatik olarak bir değişken ayarlar (sanırım).

Ben geliştirici ortamları "çit" için aşağıdaki snippet'i kullanın. «Kullanıcı» kullanıcı adlarını ve üzerinde çalıştıkları projeyi ifade eder:

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

Nginx yapılandırmasının bildirimsel olduğunu ve bu nedenle statik bildirimlerin çalışma zamanı hesaplanan değerlere ve değişkenlere göre her zaman daha hızlı olabileceğini unutmayın. Düzenli ifadelerin değerlendirilmesi nispeten maliyetlidir, sanırım ağır yüklü (üretim) ortamlarda parsimony ile kullanılmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.