django

2009-11-09 8 views
22

में पहले पृष्ठ लोड को तेज़ करना जब मैं अपनी वेबसाइट I (स्वाभाविक रूप से) पर कोड अपडेट करता हूं तो मेरा अपाचे उदाहरण पुनरारंभ करें ताकि परिवर्तन प्रभावी हो जाएंगे।django

दुर्भाग्यवश प्रत्येक अपाचे उदाहरण द्वारा प्रदत्त पहला पृष्ठ काफी धीमा है जबकि यह पहली बार रैम में सब कुछ लोड करता है (इस विशेष साइट के लिए 5-7 सेकंड)।

बाद के अनुरोध केवल 0.5 - 1.5 सेकंड लेते हैं, इसलिए मैं अपने उपयोगकर्ताओं के लिए इस प्रभाव को खत्म करना चाहता हूं।

वहाँ राम की तुलना में एक wget एक्स बार ऐसा करने के लिए पुन: प्रारंभ करने स्क्रिप्ट पुन: प्रारंभ होता लेखन

(जहां एक्स मेरी http.conf में ServerLimit द्वारा परिभाषित अपाचे उदाहरणों की संख्या है) में लोड सब कुछ पाने के लिए एक बेहतर तरीका है अपाचे और रन 5 गुना मुझे लगता है कि हैकी।

धन्यवाद!

+4

वास्तव में, एक पुनरारंभ स्क्रिप्ट लिखना जो अपाचे को पुनरारंभ करता है और 5 बार 'wget' चलाता है, मेरे लिए उचित दृष्टिकोण की तरह लगता है। –

+2

हालांकि आपको सावधान रहना पड़ सकता है कि उनमें से प्रत्येक कॉल 'wget' को एक अलग प्रक्रिया द्वारा संभाला जाता है - आपको शायद इसे सुनिश्चित करने के लिए एक अच्छी संख्या में लोड करना होगा। –

+1

मैंने इसका परीक्षण किया है और वेबफैक्शन पर अपाचे कॉन्फ़िगरेशन (जहां ऐप होस्ट किया गया है) उदाहरणों के माध्यम से चक्र करता है, इसलिए 5 'wget' की चाल – Jiaaro

उत्तर

31

अपाचे/mod_wsgi के लिए डिफ़ॉल्ट एक प्रक्रिया है जो कि आवेदन पत्र की आवश्यकता है के लिए पहले केवल अनुरोध पर लोड आवेदन कोड है। तो, प्रक्रिया शुरू होने पर और केवल पहला अनुरोध न होने पर, आपके कोड को प्रीलोड करने के लिए mod_wsgi को कॉन्फ़िगर करना पहला चरण है। यह WSGIImportScript निर्देश का उपयोग कर mod_wsgi 2.X में किया जा सकता है।

डेमॉन मोड है, जो बेहतर विकल्प वैसे भी है यह मानकर, इसका मतलब है आप की तरह कुछ होगा:

# Define process group. 

WSGIDaemonProcess django display-name=%{GROUP} 

# Mount application. 

WSGIScriptAlias//usr/local/django/mysite/apache/django.wsgi 

# Ensure application preloaded on process start. Must specify the 
# process group and application group (Python interpreter) to use. 

WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \ 
    process-group=django application-group=%{GLOBAL} 

<Directory /usr/local/django/mysite/apache> 

    # Ensure application runs in same process group and application 
    # group as was preloaded into on process start. 

    WSGIProcessGroup django 
    WSGIApplicationGroup %{GLOBAL} 

    Order deny,allow 
    Allow from all 
</Directory> 

जब आप के बजाय स्पर्श WSGI स्क्रिप्ट फ़ाइल है, जो केवल पर जाँच का एक कोड परिवर्तन किया है, अगला अनुरोध, इसके बजाय डिमन प्रक्रिया समूह में प्रक्रियाओं के लिए एक SIGINT संकेत भेजें।

WSGIDaemonProcess के लिए 'प्रदर्शन-नाम' विकल्प के साथ आप बीएसडी शैली 'ps' प्रोग्राम का उपयोग कर कौन सी प्रक्रियाओं की पहचान कर सकते हैं। 'प्रदर्शन-नाम' सेट '% {GROUP}' पर सेट किया गया है, 'ps' आउटपुट को प्रक्रिया नाम के रूप में '(wsgi: django)' दिखाना चाहिए। प्रक्रिया आईडी की पहचान करें और करें:

kill -SIGINT pid 

वास्तविक प्रक्रिया आईडी के साथ स्वैप 'पिड'। यदि डेमॉन प्रक्रिया समूह में एक से अधिक प्रक्रियाएं हैं, तो उन सभी को सिग्नल भेजें।

सुनिश्चित नहीं है कि 'killall' का उपयोग एक चरण में करने के लिए किया जा सकता है।

# Define process group. 

WSGIDaemonProcess django display-name=%{GROUP} 

# Mount application and designate which process group and 
# application group (Python interpreter) to run it in. As 
# process group and application group named, this will have 
# side effect of preloading application on process start. 

WSGIScriptAlias//usr/local/django/mysite/apache/django.wsgi \ 
    process-group=django application-group=%{GLOBAL} 

<Directory /usr/local/django/mysite/apache> 
    Order deny,allow 
    Allow from all 
</Directory> 

है, कर सकते हैं विशिष्ट प्रक्रिया के रूप में अलग WSGIImportScript निर्देश उपयोग करने की आवश्यकता: मैं MacOS एक्स

पर यह कर mod_wsgi 3.x में विन्यास सरल किया जा सकता है और इसके बजाय का उपयोग कर सकते के साथ समस्या थी समूह और अनुप्रयोग समूह को डब्लूएसजीआईस्क्रिप्ट एलीआस के तर्क के रूप में इसके बजाय साइड इफेक्ट के साथ यह प्रीलोड लोड होगा।

3

आप Django (mod_python बनाम mod_wsgi) कैसे चला रहे हैं?

यदि आप mod_wsgi (डेमॉन मोड में) चला रहे हैं, तो अपने एप्लिकेशन को पुनः लोड करने के लिए अपाचे को पुनरारंभ करना आवश्यक नहीं है। आपको बस अपनी Wsgi स्क्रिप्ट के mtime को अपडेट करना है (जिसे touch के साथ आसानी से किया जाता है)।

mod_wsgi के प्रलेखन प्रक्रिया का एक बहुत विस्तृत विवरण दिया गया है:

ReloadingSourceCode

+0

मैं सोच रहा हूं कि यह एप्लिकेशन को पुनः लोड क्यों नहीं कर रहा था! मुझे अपनी रीस्टार्ट स्क्रिप्ट को एक स्पर्श wsgi स्क्रिप्ट के साथ बदलना होगा :) क्या यह मेरे पहले लोड मुद्दे को हल करेगा? या मुझे अभी भी wget की जरूरत है? – Jiaaro

+0

यह पहले लोड पर बिताए गए समय को कम करेगा, लेकिन यह इसे खत्म नहीं करेगा। –