Mevcut tüm statik dosyaların doğrudan NGINX ile nasıl sunulacağı, ancak geri kalanının bir arka uç sunucusuna proxy'nin nasıl sunulacağı.


88
location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    if (-f $request_filename) {
        access_log off;
        expires 30d;
        break;
        }

    if (!-f $request_filename) {
        proxy_pass http://127.0.0.1:8080; # backend server listening
        break;
        }
    }

Yukarıdaki tüm mevcut dosyaları doğrudan Nginx kullanarak sunacaktır (örneğin, Nginx sadece PHP kaynak kodunu gösterir), aksi takdirde Apache'ye bir istek iletir. * .Php dosyalarını kuraldan hariç tutmam gerekiyor, böylece * .php istekleri de Apache'ye aktarılır ve işlenir.

Nginx'in tüm statik dosyaları işlemesini ve Apache'nin tüm dinamik şeyleri işlemesini istiyorum.

DÜZENLEME: Beyaz liste yaklaşımı var ama çok şık değil, Tüm bu uzantıları görün, bunu istemiyorum.

location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
    access_log off;
    expires 30d;
    }
location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
    }

DÜZENLEME 2: Nginx'in daha yeni sürümlerinde try_filesbunun yerine http://wiki.nginx.org/HttpCoreModule#try_files kullanın


Sadece işleri temizlemek için: Yukarıdaki kod diskte varsa statik bir dosya sunacaktır, dosya yoksa istek Apache'ye iletilir. Uygulamalarımdaki tüm URL'ler mod_rewrite (veya yönlendirme) kullandığından ve diskte gerçekte bulunmadığından bu çoğu zaman çalışır. Yalnızca * .php dosya adına doğrudan erişim istisnadır ve Apache tarafından çözümlenmesi gerekir.
fmalina

Yanıtlar:


153

Kullanım try_files ve adlandırılmış konum bloğu ( '@apachesite'). Bu, gereksiz normal ifade eşleşmesini ve eğer bloğunu kaldıracaktır. Daha verimli.

location / {
    root /path/to/root/of/static/files;
    try_files $uri $uri/ @apachesite;

    expires max;
    access_log off;
}

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

Güncelleme: Bu yapılandırmanın varsayımı, altında herhangi bir php betiğinin olmadığıdır /path/to/root/of/static/files. Bu, çoğu modern php çerçevesinde yaygındır. Eski php projelerinizin aynı klasörde hem php komut dosyalarına hem de statik dosyalara sahip olması durumunda, nginx'in hizmet vermesini istediğiniz tüm dosya türlerini beyaz listeye almanız gerekebilir.


wordpress kullanıyorum, bu yüzden nginx sunucusuna yükleme klasörü koymam gerekir mi?
Chameron

7
Bu çözümle ilgili sorunum: nginx diğer konumu (proxy) kullanmıyor ve dizin listesini göstermeye çalışıyor. Dolayısıyla, dizin listesi etkinleştirilmediğinden bir 403 atar. Düzenleme: Tamam, kaldırırsanız $uri/çalışır.
ChristophLSA

1
Bu, apache için proxy / example olur, ancak /example.php'nin indirilmesine izin verir.
Terence Johnson

1
@TerenceJohnson php dosyalarınızı statik dosya klasörünün altına koymak güvenli değildir. Ben ayarladığımı unutmayın root /path/to/root/of/*static*/files;. php dosyaları, internetten doğrudan erişilemeyen farklı bir klasöre koyulmalıdır.
Chuan Ma

2
İşlerin böyle olması gerektiğini biliyorum, ancak birisi her şeyi web kökü altında bulunduran ve .htaccess dosyalarına dayanan birçok yaygın kullanıma hazır PHP uygulamasının önüne Nginx koyuyorsa, kopyalamamalı ve yapılandırmanızı yapıştırın.
Terence Johnson

18

Bunu dene:

location / {
    root /path/to/root;
    expires 30d;
    access_log off;
}

location ~* ^.*\.php$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

Umarım işe yarar. Normal ifadelerin düz dizelerden daha yüksek önceliği vardır, bu nedenle, .phpsadece karşılık gelen bir .phpdosya varsa , ile biten tüm istekler Apache'ye iletilmelidir . Geri kalanı statik dosyalar olarak ele alınacaktır. Konumu değerlendirmenin gerçek algoritması burada .


6

Mod_rewrite komut dosyalarınızın uzantısını gizlemek için kullanırsanız veya sadece / ile biten güzel URL'leri seviyorsanız, buna diğer yönden yaklaşmak isteyebilirsiniz. Nginx'e statik olmayan bir uzantıya sahip her şeyin apache'ye gitmesine izin vermesini söyleyin. Örneğin:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
{
    root   /path/to/static-content;
}

location ~* ^!.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

Bu pasajın ilk bölümünü şurada buldum: http://code.google.com/p/scalr/wiki/NginxStatic


Küçültülmüş dosyalar için hala hatalar alsam da bu harika çalıştı (ör. Site.min.css ve main.min.js vb.). Bunları bir konum normal ifadesinde nasıl yakalayabilirim? @lo_fye
Garth
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.