2015-10-09 19 views
9

मैं किसी विशिष्ट स्थान पर nginx + php-fpm में CachetHQ सेवा करने का प्रयास कर रहा हूं।विभिन्न स्थान पर ऐप होस्ट करने के लिए Nginx

server { 
    listen 80; 
    server_name status.example.com; 

    root /var/www/Cachet/public; 
    index index.php; 

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

    location ~ \.php$ { 
     include fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_index index.php; 
     fastcgi_keep_conn on; 
    } 
} 

हालांकि, बजाय status.example.com में सेवा करने में, मैं example.com/status में सेवा करने के लिए करना चाहते हैं: डॉक्स इस रूप में उदाहरण है कि (जो काम करता है) status.example.com में कार्य करता है देता है।

मैं उम्मीद कर रहा था कि यह काम करेगा, लेकिन error.log से मैं इसे /etc/nginx/htmlindex.php कोशिश कर रहा है देखते हैं, लेकिन यह /mnt/data/site/www-cachet/public/index.php होना चाहिए:

location /status/ { 
    index index.php; 
    root /mnt/data/site/www-cachet/public; 

    try_files $uri index.php$is_args$args; 

    location ~ ^/status/.+\.php$ { 
     root /mnt/data/site/www-cachet/public; 
     include fastcgi_params; 
     fastcgi_pass unix:/tmp/php-fpm.sock; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_index index.php; 
     fastcgi_keep_conn on; 
    } 
} 
+0

प्राथमिकता सही नहीं है। यह पहली बार मेल खाता है 'स्थान/' – zywj

+0

@ZYWJ अच्छी तरह से' स्थान/'कोई समस्या नहीं होनी चाहिए क्योंकि मैं इसे' स्थिति ' – rodorgas

+0

@rodorgas में नहीं होना चाहता, मेरा उत्तर आपके लिए काम करता है, है ना? – cnst

उत्तर

0

इतने सारे घंटे संयोजन का एक बहुत कोशिश के बाद, जिस तरह से मैं काम कर रहा समझ में आ गया था:

location ^~ /status { 
    alias /mnt/data/site/www-cachet/public; 
    try_files $uri $uri/ @status; 

    location = /status/ { 
     rewrite /status/$ /status/index.php; 
    } 

    location ~ ^/status/(.+\.php)$ { 
     fastcgi_pass unix:/tmp/php-fpm.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /mnt/data/site/www-cachet/public/$1; 
     include fastcgi_params; 
    } 
} 

location @status { 
    rewrite /status/(.*)$ /status/index.php?/$1 last; 
} 

सबसे महत्वपूर्ण बात यह fastcgi_param था, मैं बजाय एक निरपेक्ष पथ $document_root$fastcgi_script_name या कुछ ऐसा करने के लिए यह निर्धारित करने के लिए किया था। मुझे यकीन नहीं है कि यह एक अच्छा प्रैटिस है, लेकिन ब्लॉक में alias जोड़ना सिर्फ काम नहीं करता है, और न तो nginx या FastCGI हमें उस फ़ाइल का पथ दिखाता है जिसे वे पढ़ने की कोशिश कर रहे हैं।

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

2

आपका try_files सही नहीं है।
आप इस तरह यह कर सकते हैं:

index index.php; 
root /mnt/data/site/www-cachet/public; 

location/{ 
    if (!-e $request_filename) { 
     rewrite ^(.*)$ /index.php?$1 last; 
     break; 
    } 
} 

location ~ ^/status/.+\.php$ { 
    root /mnt/data/site/www-cachet/public; 
    include fastcgi_params; 
    fastcgi_pass unix:/tmp/php-fpm.sock; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_index index.php; 
    fastcgi_keep_conn on; 
} 
+0

Nginx कॉन्फ़िगरेशन परीक्षण विफल रहता है, कह रहा है कि 'स्थान "/" बाहरी स्थान है "/ स्थिति" '। मैंने त्रुटियों से छुटकारा पाने के लिए संशोधित किया है। फिर, लॉग ने मुझे दिखाया कि nginx स्क्रिप्ट को FastCGI को भेजता है, लेकिन HTTP प्रतिक्रिया "फ़ाइल नहीं मिली" है। Error.log में, संदेश "प्राथमिक स्क्रिप्ट अज्ञात" है। क्या कोई तरीका है कि हम देखते हैं कि यह किस मार्ग तक पहुंचने का प्रयास कर रहा है? – rodorgas

2

मुझे मूल विन्यास है कि आप काम करता है का दावा साथ शुरू करते हैं, और अपनी आवश्यकताओं के लिए इसे संशोधित करने की कोशिश, नीचे दिए गए परिणाम:

location ^~ /status { 
    alias /var/www/Cachet/public; 
    index index.php; 

    location = /status { 
     return 302 /status/; 
    } 
    location/{ 
     try_files $uri /status/index.php$is_args$args; 
    } 

    location ~ \.php$ { 
     include fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     rewrite ^/status/(.*) /$1; 
     rewrite ^(.*)/ $1/index.php; # who knows what fastcgi_index is for? 
     fastcgi_param SCRIPT_FILENAME $document_root$uri; 
     fastcgi_keep_conn on; 
    } 
} 

मूल रूप से, आप root के बजाय alias का उपयोग करना चाहते हैं, और शायद अंतिम try_files में भी एक पूर्ण पथ है। मुझे नहीं लगता कि नेस्टेड स्थानों के भीतर अतिरिक्त उपसर्ग जोड़ना आवश्यक है, लेकिन आप यह सुनिश्चित करना चाहते हैं कि रूट स्थान ^~ संशोधक के साथ अंतिम मिलान है।

मुख्य चाल, मुझे लगता है, यहां तक ​​कि alias निर्देश चीजों के साथ एक उचित root साथ के रूप में के रूप में dandy नहीं हैं, इसलिए, आप सुनिश्चित SCRIPT_FILENAME ठीक से सेट है बनाने के लिए होता है। यह हिस्सा बहुत स्पष्ट रूप से प्रलेखित नहीं प्रतीत होता है, और मैं यह जांचने के लिए बहुत आलसी हूं कि $fastcgi_script_namengx variable और fastcgi_index निर्देश alias के साथ अच्छा खेलें - यह निर्धारित करने की कोशिश करने के बजाय कि वे कैसे काम करते हैं (या नहीं), हम बस rewrite लागू होने वाले नियम, और इसके बजाय हमारे पुनर्लेखन नियमों के परिणामों के आधार पर SCRIPT_FILENAME का निर्माण करें। :-)

हालांकि, इसके साथ, मुझे लगता है कि दूसरा पुनर्लेखन नियम (साथ ही fastcgi_index यह प्रतिस्थापित करता है) शायद एक नो-ऑप भी हो सकता है, क्योंकि हम \.php$ में कैसे समाप्त होना चाहते थे location अगर $uri.php में पहले से खत्म नहीं हुआ है? (इसी तरह, आप पहली बार पुनर्लेखन नियम भी दूर करने के लिए, और $fastcgi_script_name साथ SCRIPT_FILENAME में $uri की जगह है, और अगर चीजें अभी भी काम को देखने की कोशिश करने के लिए स्वतंत्र हैं, लेकिन इंटरनेट from 2009 का संकेत हो सकता है कि उन्होंने ऐसा नहीं किया।)

+0

Nginx कॉन्फ़िगरेशन परीक्षण कहता है कि 'स्थान"/"बाहरी स्थान है"/स्थिति "'। मैं nginx/1.8.0 का उपयोग कर रहा हूँ। मैंने 'स्थान /' को 'स्थान/स्थिति /' में संशोधित किया और मुझे 404 मिल गया, त्रुटि.लॉग में मुझे लगता है कि यह /etc/nginx/htmlindex.php तक पहुंचने का प्रयास कर रहा है। – rodorgas

+0

@rodorgas, आपको इस तरह की 404 त्रुटि कैसे मिल रही है? मैंने कभी भी किसी को/etc/nginx/htmlindex.php' पर इशारा करते हुए त्रुटियों को नहीं देखा है, आपके कॉन्फ़िगरेशन फ़ाइल के बारे में कुछ और अजीब होना चाहिए या जिस तरह से आप मेरा उदाहरण कॉपी करते हैं। '/' बाहर '/ status' के लिए, निश्चित रूप से, इसे केवल '/ status' में बदलें, और यह ठीक होना चाहिए। – cnst

+0

'कर्ल http: // साइट/स्थिति /' (कर्ल ताकि प्रतिक्रिया कैश नहीं किया गया हो),/स्थिति/सेटअप, और सामान, वे सभी एक ही अजीब स्थान आज़माएं। मैंने '/ etc/nginx /' में सभी फ़ाइलों के माध्यम से खोज की, जहां conf.d फ़ाइलें और अन्य रखा गया है, और उनमें से कोई भी '/ etc/nginx/html' पथ नहीं है। मैंने अपनी कॉपी-पेस्ट भी दोगुना कर दी, यह उम्मीद के अनुसार काम कर रहा है। कुछ अजीब हो रहा है, और इसे केवल (बग्गी?) चर के बजाय एक पूर्ण पथ स्थापित करके तय किया जा सकता है। – rodorgas

संबंधित मुद्दे