एनजीआईएनएक्स के साथ सीधे सभी मौजूदा स्थिर फ़ाइलों की सेवा कैसे करें, लेकिन बाकी को बैकएंड सर्वर पर प्रॉक्सी करें।


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

ऊपर सभी मौजूदा फ़ाइलों को सीधे Nginx (जैसे Nginx सिर्फ PHP स्रोत कोड प्रदर्शित करता है) का उपयोग करेगा, अन्यथा अपाचे के लिए एक अनुरोध को अग्रेषित करें। मुझे नियम से * .php फ़ाइलों को बाहर करने की आवश्यकता है ताकि * .php के लिए अनुरोध भी अपाचे के लिए पारित हो जाएं और संसाधित हो जाएं।

मैं चाहता हूं कि सभी गतिशील सामानों को संसाधित करने के लिए Nginx सभी स्थिर फ़ाइलों और Apache को संभाल सके।

संपादित करें: सफेद सूची दृष्टिकोण है, लेकिन यह बहुत सुंदर नहीं है, उन सभी एक्सटेंशनों को देखें, मुझे यह नहीं चाहिए।

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

EDIT 2: Nginx के नए संस्करणों के try_filesबजाय http://wiki.nginx.org/HttpCoreModule#try_files का उपयोग करें


बस चीजों को साफ करने के लिए: उपरोक्त कोड डिस्क पर मौजूद होने पर एक स्थैतिक फ़ाइल का काम करेगा, यदि फ़ाइल मौजूद नहीं है तो अपाचे को अनुरोध पारित किया जाता है। यह अधिकतर समय काम करता है क्योंकि मेरे एप्लिकेशन के सभी URL mod_rewrite (या राउटिंग) का उपयोग करते हैं और डिस्क पर वास्तव में मौजूद नहीं होते हैं। केवल .php फ़ाइल नाम के लिए सीधी पहुँच अपवाद है और अपाचे द्वारा पार्स करने की आवश्यकता है।
फेलिना

जवाबों:


152

उपयोग try_files और नाम स्थान ब्लॉक ( '@apachesite')। यह अनावश्यक रेगेक्स मैच और यदि ब्लॉक को हटा देगा। अधिक कुशल।

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

अद्यतन: इस विन्यास की धारणा यह है कि किसी भी php स्क्रिप्ट के अंतर्गत मौजूद नहीं है /path/to/root/of/static/files। यह सबसे आधुनिक php चौखटे में आम है। यदि आपके लीगेसी php प्रोजेक्ट्स में php स्क्रिप्ट्स और स्टैटिक फाइल्स दोनों एक ही फोल्डर में मिली होती हैं, तो आपको उन सभी प्रकार के फाइल को व्हाइटलाइन करना पड़ सकता है, जिन्हें आप nginx को सर्व करना चाहते हैं।


मैं WordPress का उपयोग कर रहा हूँ, तो क्या मुझे nginx सर्वर पर अपलोड फ़ोल्डर डालने की आवश्यकता है?
चमारन

7
इस समाधान के साथ मेरी समस्या: nginx अन्य स्थान (प्रॉक्सी) का उपयोग नहीं करता है और निर्देशिका लिस्टिंग दिखाने की कोशिश करता है। इसलिए यह एक 403 फेंकता है क्योंकि निर्देशिका लिस्टिंग सक्रिय नहीं है। संपादित करें: ठीक है अगर आप निकालते हैं $uri/तो यह काम करता है।
क्रिस्टोफएलएसए

1
यह अपाचे के लिए प्रॉक्सी / उदाहरण देगा लेकिन /example.php को डाउनलोड करने की अनुमति देगा।
टेरेंस जॉनसन

1
@TerenceJohnson अपनी php फाइलों को स्टैटिक फाइल फोल्डर के नीचे रखना सुरक्षित नहीं है। ध्यान दें कि मैंने निर्धारित किया है root /path/to/root/of/*static*/files;। php फ़ाइलों को एक अलग फ़ोल्डर में रखा जाना चाहिए, जो सीधे इंटरनेट से सुलभ नहीं है।
चुआन मा

2
मुझे पता है कि जिस तरह से चीजें होनी चाहिए, लेकिन अगर कोई भी किसी भी सामान्य ऑफ-द-शेल्फ पीएचपी अनुप्रयोगों में से किसी के सामने नग्नेक्स डाल रहा है, जिसके पास वेब रूट के तहत सब कुछ है और .htaccess फ़ाइलों पर निर्भर हैं, तो उन्हें कॉपी नहीं करना चाहिए। अपना कॉन्फ़िगरेशन पेस्ट करें।
टेरेंस जॉनसन

18

इसे इस्तेमाल करे:

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

उम्मीद है कि यह काम करता है। नियमित अभिव्यक्तियों में सादे तार की तुलना में अधिक प्राथमिकता होती है, इसलिए .phpकेवल एक संगत .phpफ़ाइल मौजूद होने पर अपाचे में समाप्त होने वाले सभी अनुरोधों को अपाचे पर भेज दिया जाना चाहिए । बाकी को स्थिर फाइलों के रूप में संभाला जाएगा। मूल्यांकन स्थान का वास्तविक एल्गोरिदम यहाँ है


6

यदि आप अपनी स्क्रिप्ट के विस्तार को छिपाने के लिए mod_rewrite का उपयोग करते हैं, या यदि आप सुंदर URL पसंद करते हैं जो / में समाप्त होते हैं, तो हो सकता है कि आप इसे दूसरी दिशा से एक्सेस करना चाहते हों। अपाचे के माध्यम से जाने के लिए एक गैर-स्थैतिक विस्तार के साथ कुछ भी करने के लिए नंगेक्स को बताएं। उदाहरण के लिए:

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

मुझे इस स्निपेट का पहला भाग इस पर मिला: http://code.google.com/p/scalr/wiki/NginxStatic


इसने बहुत अच्छा काम किया, हालाँकि मुझे अभी भी छोटी फ़ाइलों (जैसे site.min.css और main.min.js आदि) के लिए त्रुटियाँ मिलती हैं। मैं उन लोगों को स्थान रेगेक्स में कैसे पकड़ूंगा? @lo_fye
गर्थ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.