Nginx - Kök ve diğer ad ile karışıklık sunan statik dosya


473

Uygulamamı uygulama sunucum aracılığıyla 8080ve statik dosyalarımı bir dizinden uygulama sunucusuna dokunmadan sunmam gerekiyor. Sahip olduğum nginx yapılandırma böyle bir şey ...

    # app server on port 8080
    # nginx listens on port 8123
    server {
            listen          8123;
            access_log      off;

            location /static/ {
                    # root /var/www/app/static/;
                    alias /var/www/app/static/;
                    autoindex off;
            }


            location / {
                    proxy_pass              http://127.0.0.1:8080;
                    proxy_set_header        Host             $host;
                    proxy_set_header        X-Real-IP        $remote_addr;
                    proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
            }
    }

Şimdi, bu yapılandırma ile her şey iyi çalışıyor. Not rootyönergesi dışarı yorum.

- özelliğini etkinleştirir rootve devre dışı bırakırsam alias- çalışmayı durdurur. Ben sondaki kaldırmak Ancak, /static/gelen roottekrar çalışmaya başlar.

Birisi neler olduğunu açıklayabilir mi? Ayrıca arasındaki farklar nelerdir açıkça ve verbosely açıklayınız rootve aliasve bunların amaçları.

Yanıtlar:


1074

Kafa karışıklıklarıma cevaplar buldum.

Arasında çok önemli bir fark vardır rootve aliasdirektifleri. Bu fark, rootveya öğesinde belirtilen yolun aliasişlenme biçiminde vardır .

rootYönerge durumunda , konum kısmı da dahil olmak üzere köke tam yol eklenirken , aliasyönerge söz konusu olduğunda , yolun yalnızca konum kısmını içermeyen kısmı takma adına eklenir .

Örneklemek gerekirse:

Diyelim ki

location /static/ {
    root /var/www/app/static/;
    autoindex off;
}

Bu durumda Nginx'in türeteceği son yol

/var/www/app/static/static

Bu dönüş gidiyor 404hiçbir olmadığından static/içindestatic/

Bunun nedeni, konum bölümünün root. Bu nedenle, rootdoğru yol

location /static/ {
    root /var/www/app/;
    autoindex off;
}

Öte yandan, aliaskonum kısmı düşüyor . Yani yapılandırma için

location /static/ {
    alias /var/www/app/static/;
    autoindex off;           ↑
}                            |
                             pay attention to this trailing slash

son yol doğru şekilde oluşturulacaktır.

/var/www/app/static

aliasDirektif için sondaki eğik çizgi

Nginx belgelerine göre bir eğik çizginin zorunlu olup olmadığı konusunda kesin bir kılavuz yoktur , ancak buradaki ve başka yerlerdeki insanlar tarafından yapılan ortak bir gözlem, bunun olduğunu göstermektedir.

Birkaç yer daha kesin olarak değil, bunu tartıştı.

/server/376162/how-can-i-create-a-location-in-nginx-that-works-with-and-without-a-trailing-slas

/server/375602/why-is-my-nginx-alias-not-working


97
Takma ad yolundaki sondaki eğik çizgi önemlidir!
mafrosis

2
Bu harika (yapılandırma sorunlarımı düzeltmeme yardımcı oldu), ancak insanların bu tür sorunları teşhis etmek için hangi günlük ayarlarını kullanabileceğini merak ediyorum? Gibi, "konum [...]" yapılandırma bloğu ile eşleşen, "[[]] için istek alındı, dizini [...]" ile eşleşen günlüklere yazdıracak her şey
Pistos

2
@Pistos: koymak log_format scripts '$document_root | $uri | > $request';içine httpbölümü ve access_log /var/log/nginx/scripts.log scripts;içine servernginx yapılandırma .. bölümünde
Helvete

Teşekkürler! Aslında sondaki eğik çizgi takma adda gereklidir, aksi takdirde aldım nginx: [emerg] invalid number of arguments in "alias" directiveve sunucu yeniden başlatılması sırasında düştü.
FotisK

@mafrosis Neden önemlidir?
Bruce Sun

104

as say as @treecoder

rootYönerge durumunda , konum kısmı da dahil olmak üzere köke tam yol eklenirken, aliasyönerge söz konusu olduğunda , yolun yalnızca konum kısmını içermeyen kısmı takma adına eklenir.

Bir resim bin kelime değerinde bir olup

için root:

resim açıklamasını buraya girin

için alias:

resim açıklamasını buraya girin


11
İkinci resimdeki ilk ok "+" olmalı mı?
aioobe

35

Senin durumunda kullanabilirsiniz root, çünkü yönerge $uriparçası locationyönergesi son ile aynıdır rootyönerge parçası.

Nginx belgeleri de bunu önerir :
Konum, yönerge değerinin son kısmıyla eşleştiğinde:

location /images/ {
    alias /data/w3/images/;
}

bunun yerine kök yönergesini kullanmak daha iyidir:

location /images/ {
    root /data/w3;
}

ve rootdirektif $uriyola eklenir .


2
Neden daha iyi? Dokümanlar da söylemez.
HostedMetrics.com

Gördüğüm fayda, takma ad kullanırken $
uri'nin

21

@ Good_computer'ın çok yardımcı cevabına sadece hızlı bir ek, URL'nin kökünü bir klasörle değiştirmek istedim, ancak yalnızca statik dosyaları içeren bir alt klasörle eşleştiğinde (yolun bir parçası olarak saklamak istedim).

Örneğin, istenen dosya /app/jsveya içindeyse /app/css, bakın /app/location/public/[that folder].

Bunu bir regex kullanarak işe aldım.

 location ~ ^/app/((images/|stylesheets/|javascripts/).*)$ {
     alias /home/user/sites/app/public/$1;
     access_log off;
     expires max;
 }

2
Bu cevap için teşekkürler. Bunun 3 yıl sonra olduğunu biliyorum, ancak herkes takma adın root'a karşı kullanılması arasında bir performans ve / veya güvenlik dengesi olup olmadığını açıklayabilir mi?
Mina

1
@Mina Mümkünse root kullanmak daha iyidir. ( Wiki.nginx.org/HttpCoreModule#alias belgelerinde bir yorum var )
Matthew Wilcoxson


6

aliasistek yolundaki konum parçası yolunu (LPP) değiştirmek için kullanılırken, istek yoluna rooteklenmek üzere kullanılır.

İstek yolunu son dosya yoluyla eşlemenin iki yoludur.

aliasyalnızca konum bloğunda kullanılabilir ve dış kısmı geçersiz kılar root.

aliasve rootkonum bloğunda birlikte kullanılamaz.


3
server {
    server_name xyz.com;
    root /home/ubuntu/project_folder/;

    client_max_body_size 10M;
    access_log  /var/log/nginx/project.access.log;
    error_log  /var/log/nginx/project.error.log;

    location /static {
        index index.html;
    }

    location /media {
        alias /home/ubuntu/project/media/;
    }
}

Statik sayfayı nginx üzerinde yaşamak için sunucu bloğu.


2

Başka bir deyişle, bu kısa tutulması: rootbelirtilen konum bağımsız değişkeni, dosya sisteminin yolunun ve URI'sının bir parçasıdır . Öte yandan - aliaskonum ifadesinin yönerge argümanı sadece URI'nin bir parçasıdır

Bu nedenle, aliasbelirli URI'yi dosya sistemindeki belirli yolla eşleyen farklı bir ad iken root, rootyönerge argümanı olarak verilen kök yola konum argümanı ekler .

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.