2012-06-21 24 views
9

क्या nginx के कस्टम त्रुटि पृष्ठों को अक्षम करना संभव है - अगर मैं उन्हें कॉल कर सकता हूं - मेरे ढांचे के अपवाद पृष्ठों को प्रदर्शित करने के लिए?nginx + uwsgi + flask - कस्टम त्रुटि पृष्ठों को अक्षम करना

मैं वास्तव में नहीं देख सकते हैं मेरी WERKZEUG डिबगर उपकरण html में गाया ...

अद्यतन

ठीक है, मैं काम करने के लिए एक बहुत ही बहुत ही सरल कुप्पी आवेदन बनाने के लिए मिला है और मैं पोस्ट करेंगे बिट्स:

/home/my_user/.virtualenvs/nginx-test/etc/nginx.conf

worker_processes 1; 
events { worker_connections 1024; } 
http { 
     server { 
       listen 5000; 
       server_name localhost; 
       access_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/access.log; 
       error_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/error.log; 

       location/{ 
         include uwsgi_params; 
         uwsgi_pass unix:/tmp/uwsgi.sock; 
       } 
     } 
} 

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask 

app = Flask(__name__) 

@app.route('/') 
def index(): 
    raise Exception() 

if __name__ == '__main__': 
    app.run('0.0.0.0', debug=True) 

PYTHONPATH वातावरण चर:

$ echo $PYTHONPATH 
/home/my_user/dev/ 

मैं कैसे uwsgi चलाएँ:

$ uwsgi -s /tmp/uwsgi.sock --module nginx_test --callable app 

मैं कैसे nginx चलाने :

$ nginx -c ~/.virtualenvs/nginx-test/etc/nginx.conf -p ~/.virtualenvs/nginx-test/lib/nginx/ 

अगर मैं जड़ पेज मारा:

server error

अगर मैं मैन्युअल रूप से की तरह nginx चलाएँ:

python /home/my_user/dev/nginx_test/___init___.py 

मैं बजाय देखेंगे, और क्या मैं देखना चाहता हूँ:

enter image description here

बेशक मैंने यह सुनिश्चित किया कि यह काम करेगा जब मैंने पूर्व को नहीं बढ़ाया ception, लेकिन मेरे सूचकांक() समारोह पर उदाहरण के लिए 'हैलो वर्ल्ड' लौटा दिया।

यह .NET में कस्टम त्रुटि पृष्ठों को संदर्भित किया जाता है। मैं इसे अक्षम करना चाहता हूं और nginx/uwsgi को आंतरिक सर्वर त्रुटि चीज़ के बजाय सीधे ब्राउज़र पर डीबगर द्वारा उत्पन्न एचटीएमएल को पास करना चाहता हूं।

अद्यतन 2

अब अगर मैं द्वारा मोड डिबगिंग सक्षम करने के लिए मेरी कुप्पी एप्लिकेशन को यह बदलने:

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask 

app = Flask(__name__) 
app.config.update(DEBUG=True) 
@app.route('/') 
def index(): 
    raise Exception() 

if __name__ == '__main__': 
    app.run('0.0.0.0', debug=True) 

तब मुझे 502 त्रुटि मिलती है।

लेकिन अगर मैं के बजाय बढ़ाने अपवाद:

/घर/my_user/dev/nginx_test/___ init___।py

from flask import Flask 

app = Flask(__name__) 
app.config.update(DEBUG=True) 
@app.route('/') 
def index(): 
    return 'Hello World' 

if __name__ == '__main__': 
    app.run('0.0.0.0', debug=True) 

जब मैं पृष्ठ (http://localhost:5000) मारा मैं अपने ब्राउज़र पर 'नमस्ते विश्व' मिलता है।

+1

इस प्रश्न में यह बताने के लिए बेहतर होगा कि आपको किस त्रुटि पृष्ठ में समस्या है। 502 – number5

+0

आपके सुझाव के लिए धन्यवाद, मैंने एक बहुत सारी नई जानकारी जोड़ दी है जो उम्मीद है कि इस मुद्दे को समझने में मदद मिलेगी। –

उत्तर

1

फ्लास्क में अपने स्वयं के त्रुटि हैंडलर पंजीकृत करने के लिए Flask#errorhandler का उपयोग करें।

app = Flask() 

@app.errorhandler(404) 
def handel_404(error): 
    return render_template('404.html') 
+0

मेरा मतलब था, मुझे वास्तव में क्या चाहिए, जब मेरे कोड में अपवाद() 'बढ़ाया जाता है, तो मुझे nginx 502 खराब गेटवे पृष्ठ –

+2

आह के बजाय werkzeug डीबगर दिखाई देता है, यदि आपको 502 खराब गेटवे मिल रहा है, तो आपके ऐप को शुरू करने का मौका मिलने से पहले त्रुटि खुशी हो रही है। Werkzeug डीबगर केवल अनुरोधों को दबाने वाली त्रुटियों को संभाल सकता है। समस्या को ठीक करने के लिए आपको अपने यूवीजीआई लॉग को स्टैक ट्रेस के लिए जांचना होगा। – Trevor

+1

आप अपने nginx कॉन्फ़िगरेशन में 'error_page 502 = 503 /error_page.html; निर्देश' जोड़कर पृष्ठ को कैसा दिखाना चाहते हैं, लेकिन यह केवल एक स्थिर पृष्ठ होगा। – Trevor

6

यह "आंतरिक सर्वर त्रुटि" पृष्ठ nginx से लेकिन बोतल से नहीं है: उदाहरण के 404 को बदलने के लिए के लिए आप की तरह कुछ करना होगा। यह करता है जब डीबग मोड बंद होता है।

uwsgi एक मॉड्यूल के रूप में अपना कोड आयात कर रहा है, एक स्क्रिप्ट के रूप में नहीं चल रहा है। __name__ == '__main__' गलत है और यदि कथन निष्पादित नहीं किया गया है। अगर के बाहर डिबग मोड सेट करके देखें:

app = Flask(__name__) 
app.debug = True 

हालांकि, यह दृढ़ता से की सिफारिश की है कभी नहीं सार्वजनिक इंटरनेट पर एक सर्वर पर डिबग मोड छोड़ देते हैं, के बाद से उपयोगकर्ता सर्वर किसी भी कोड को चलाने कर सकते हैं। यह एक गंभीर सुरक्षा मुद्दा है।

+0

मैंने सोचा था कि क्या था: app.config.update (DEBUG = True) ने - वर्तमान में अगर से बाहर किया ... लेकिन मैं इसे app.debug = True सेट करके बस कोशिश करूँगा जैसा कि आप सुझाव देते हैं और आपको परिणाम बताते हैं । –

+0

app.debug = True app.config.update (DEBUG = True) के समान होना चाहिए ([1] (https://github.com/mitsuhiko/flask/blob/0.9/flask/app.py#L170) , [2] (https://github.com/mitsuhiko/flask/blob/0.9/flask/config.py#L21)) सुनिश्चित करें कि इनमें से कोई भी uwsgi द्वारा निष्पादित किया गया है। 'ऐप = फ्लास्क (__ नाम __) ' –

+0

हाँ के ठीक बाद में डालना सबसे आसान है, इस तरह मैं अपने उदाहरण में करता हूं। मैं बस सुनिश्चित करने के लिए फिर कोशिश करूंगा।लेकिन अब फ्लास्क के डिबगिंग मोड को सक्षम करने के बाद, मुझे 502 खराब गेटवे त्रुटि के साथ मारा गया है, जिसे मैं nginx पर इंगित करता हूं ... UPDATE2 देखें। –

1

साइमन सैपिन ने वास्तव में आपको सही उत्तर दिया है। आपको फ्लास्क में डीबग सक्षम करने की आवश्यकता है। Nginx किसी कस्टम त्रुटि पृष्ठों को तब तक नहीं लौटाता जब तक कि आप इसे ऐसा करने के लिए स्पष्ट रूप से कॉन्फ़िगर नहीं करते।

यदि आप निम्न कोड का उपयोग करते हैं तो आप अपने डीबग संदेशों को फ्लास्क से देखेंगे, जो Nginx के माध्यम से प्रॉक्सी किया गया है।

from flask import Flask 

app = Flask(__name__) 
app.debug = True 

@app.route('/') 
def index(): 
    raise Exception() 

अपने अद्यतन 2. आप एक 502 (अवैध गेटवे) देख रहे हैं क्योंकि बोतल बस सब पर कोई प्रतिक्रिया नहीं लौटा रहा है, या एक प्रतिक्रिया है कि Nginx नहीं समझती के अनुसार। 502 Nginx के साथ कोई समस्या नहीं है। इसका मतलब है कि जो भी Nginx बात करने की कोशिश कर रहा है (इस मामले में आपका फ्लास्क ऐप) बिल्कुल ठीक से काम नहीं कर रहा है।

हालांकि, कई तरीकों से आपको यह नहीं करना चाहिए। डीबगिंग मोड केवल तभी सक्षम होना चाहिए जब आप अपनी स्थानीय देव मशीन पर फ्लास्क चला रहे हों। वैसे भी if __name__ == "__main__": लाइन का पूरा बिंदु कौन सा है।

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