नग्नेक्स कैशिंग सिमिलिंक


12

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

मैंने इसे हल करने के बारे में कुछ ट्यूटोरियल और पोस्ट पढ़े हैं, लेकिन बहुत अधिक जानकारी नहीं है और कुछ भी काम नहीं करता है। यहाँ मेरी vhost फ़ाइल है:

server {
    listen 80;

    server_name ~^(www\.)?(?<sname>.+?).testing.domain.com$;
    root /var/www/$sname/current/public;
    index index.html index.htm index.php;

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

    location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
        add_header        Cache-Control public;
        add_header        Cache-Control must-revalidate;
        expires           7d;
    }

    location ~ \.php$ {
        #fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        include fastcgi_params;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
    }

    location ~ /\.ht {
        deny all;
    }
}

और यहाँ मेरा fastcgi_params है:

fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
fastcgi_param   QUERY_STRING        $query_string;
fastcgi_param   REQUEST_METHOD      $request_method;
fastcgi_param   CONTENT_TYPE        $content_type;
fastcgi_param   CONTENT_LENGTH      $content_length;

fastcgi_param   SCRIPT_NAME     $fastcgi_script_name;
fastcgi_param   REQUEST_URI     $request_uri;
fastcgi_param   DOCUMENT_URI        $document_uri;
fastcgi_param   DOCUMENT_ROOT           $realpath_root;
fastcgi_param   SERVER_PROTOCOL     $server_protocol;

fastcgi_param   GATEWAY_INTERFACE   CGI/1.1;
fastcgi_param   SERVER_SOFTWARE     nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR     $remote_addr;
fastcgi_param   REMOTE_PORT     $remote_port;
fastcgi_param   SERVER_ADDR     $server_addr;
fastcgi_param   SERVER_PORT     $server_port;
fastcgi_param   SERVER_NAME     $server_name;

fastcgi_param   HTTPS           $https if_not_empty;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS     200;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

मैं वास्तव में इस बात की सराहना करूंगा कि अगर कोई मेरी मदद कर सकता है तो फिलहाल हर तैनाती में पिछली तैनाती को हटाना शामिल है। सिस्टम Ubuntu 14.04.5 LTS है; PHP 7.1; नेग्नेक्स नेग्नेक्स / 1.4.6 (उबंटू)

जवाबों:


22

एंबेडेड चर , $realpath_root: एक निरपेक्ष पथ नाम करने के लिए इसी जड़ या उर्फ वर्तमान अनुरोध के लिए निर्देश के मूल्य, सभी सांकेतिक लिंक के साथ वास्तविक पथ का संकल्प लिया

इसके $realpath_rootबजाय का उपयोग करने का समाधान $document_rootQ / A साइटों और फ़ोरम के चारों ओर कॉपी-पेस्ट किया गया है; यह वास्तव में it.Yet ढूँढने से बचने के लिए मुश्किल है, मैं सिर्फ देखा है यह अच्छी तरह से समझाया द्वारा एक बार रस्मुस लेर्दोर्फ़ । यह साझा करने के लायक है क्योंकि यह बताता है कि यह क्यों काम करता है और इसका उपयोग कब किया जाना चाहिए।

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

नगनेक्स के साथ यह काफी सरल है। बस इसे अपने कॉन्‍फ़िगर में जोड़ें:

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;

यह nginx को realpath बताता है docroot सिमलिंक को हल करता है जिसका अर्थ है कि जहां तक ​​आपका PHP एप्लिकेशन जानता है, यदि वास्तविक document_root में सिम्लिंक का लक्ष्य है। अब, एक बार अनुरोध शुरू होने के बाद, nginx सिम्लिंक को हल कर देगा क्योंकि यह उस बिंदु पर खड़ा होता है और अनुरोध की अवधि के लिए यह एक ही डॉक्रोट डायरेक्टरी का उपयोग करेगा, भले ही सिमलिंक स्विच मध्य-अनुरोध हो रहा हो। यह यहां वर्णित लक्षणों को पूरी तरह से समाप्त करता है और यह सही दृष्टिकोण है। यह ऐसा कुछ नहीं है जिसे opcache स्तर पर हल किया जा सकता है।

कनिष्क डुडेजा को इससे समस्या थी और उन्होंने एक उपयोगी नोटिस जोड़ा: सुनिश्चित करें कि ये बदलाव वास्तव में अंतिम कॉन्फ़िगरेशन में होंगे, अर्थात इसके बाद include fastcgi_params;अन्यथा उन्हें ओवरराइड कर दिया जाएगा।


नमस्ते, यह एक महान जवाब है, लेकिन अगर आप मेरे कॉन्फिगरेशन में देखें तो मेरे पास fastcgi_param DOCUMENT_ROOT $ realpath_root है; fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name; Fastcgi_params के बाद शामिल है, और यह वास्तव में मदद नहीं करता है। जब मैं php-fpm को पुनः आरंभ करता हूँ तो सिम्बलिंक्स हल हो जाते हैं। क्या यह इंगित करेगा कि मेरे पास इसके बजाय एक php कैशिंग मुद्दा है?
औरिस

संशोधित करें। तुम्हारा SCRIPT_FILENAMEहै $document_root, नहीं $realpath_root
एसा जोकिनेन

हम्म ... लेकिन मैं इसे समझने के लिए इसे जिस तरह DOCUMENT_ROOTसे सेट करता $realpath_rootहूं, इसे मूल्य को खींचना चाहिए या क्या मैं पूरी तरह से गलत हूं और DOCUMENT_ROOTइसका संबंध नहीं है$document_root
औरिस

1
नमस्ते, आपके उत्तर और आपके स्पष्टीकरण के लिए बहुत-बहुत धन्यवाद, मेरी गलती थी जो धारणा को DOCUMENT_ROOTप्रभावित करती है$document root
Auris

2
मैं इस मुद्दे के साथ सर्वर पर अपाचे + php-fpm का उपयोग कर रहा हूं और मेरे लिए काम करने वाले ओपेकैड को क्लीयर कर रहा हूं, हमारे पास हालांकि कैपिस्ट्रानो की तैनाती के लिए कोई बैश स्क्रिप्ट नहीं है। मुझे लगता है कि यह एक सरल उपाय है और किसी भी तरह से अपनी अपाचे को साफ करने के लिए यह एक अच्छा अभ्यास है। रामास टिप्पणी के लिंक के लिए एसा धन्यवाद कि सोना है!
कार्लोस माफ़ला

3

से /unix/157022/make-nginx-follow-symlinks , ऐसा लगता है कि आप को बदलने के द्वारा समस्या के समाधान करने में सक्षम हो सकता है

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

सेवा

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;

(यानी से रास्ता बदल रहा $document_rootहै $realpath_root)।

मुझे इस बात की पुष्टि करने के लिए वर्तमान में एक nginx सर्वर तक पहुंच नहीं है (मेरा होम सर्वर वर्तमान में पुनर्निर्माण कर रहा है), लेकिन समाधान https://medium.com/@kanishkdudeja/truly-atomic-didloyments द्वारा सहयोग किया जा रहा है -साथ-nginx और php-FPM-aed8a8ac1cd9

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.