2012-05-11 16 views
8

यह हमारे उत्पादन सर्वर पर हमारे गधे को वास्तव में कड़ी मेहनत करना शुरू कर दिया। हमने इसे कभी-कभी देखा (प्रति सप्ताह 1 अनुरोध के लिए)। फिर हमने पाया कि यह mod_wsgi कुछ कॉन्फ़िगरेशन में कुछ फंकी चीजें करने के कारण है। चूंकि हम बग के कारण को ट्रैक नहीं कर सके, हमने फैसला किया कि उसे तुरंत ध्यान देने की आवश्यकता नहीं है।mod_wsgi त्रुटि - वर्ग .__ dict__ प्रतिबंधित मोड में उपलब्ध नहीं है

हालांकि आज, हमारे उत्पादन सर्वरों में से 1 पर यह वास्तव में सभी सर्वर अनुरोधों के 10% के लिए हुआ; ,

mod_wsgi (pid=1718): Target WSGI script '/installation/dir/our-program/prod-dispatch.wsgi' cannot be loaded as Python module. 
mod_wsgi (pid=1718): Exception occurred processing WSGI script '/installation/dir/our-program/prod-dispatch.wsgi'. 
Traceback (most recent call last): 
    File "/installation/dir/our-program/prod-dispatch.wsgi", line 7, in <module> 
    from pyramid.paster import get_app 
    File "/installation/dir/venv/local/lib/python2.7/site-packages/pyramid-1.3a6-py2.7.egg/pyramid/paster.py", line 12, in <module> 
    from pyramid.scripting import prepare 
    File "/installation/dir/venv/local/lib/python2.7/site-packages/pyramid-1.3a6-py2.7.egg/pyramid/scripting.py", line 1, in <module> 
    from pyramid.config import global_registries 
    File "/installation/dir/venv/local/lib/python2.7/site-packages/pyramid-1.3a6-py2.7.egg/pyramid/config/__init__.py", line 61, in <module> 
    from pyramid.config.assets import AssetsConfiguratorMixin 
    File "/installation/dir/venv/local/lib/python2.7/site-packages/pyramid-1.3a6-py2.7.egg/pyramid/config/assets.py", line 83, in <module> 
    @implementer(IPackageOverrides) 
    File "/installation/dir/venv/local/lib/python2.7/site-packages/zope.interface-3.8.0-py2.7-linux-x86_64.egg/zope/interface/declarations.py", line 480, in __ 
    classImplements(ob, *self.interfaces) 
    File "/installation/dir/venv/local/lib/python2.7/site-packages/zope.interface-3.8.0-py2.7-linux-x86_64.egg/zope/interface/declarations.py", line 445, in cl 
    spec = implementedBy(cls) 
    File "/installation/dir/venv/local/lib/python2.7/site-packages/zope.interface-3.8.0-py2.7-linux-x86_64.egg/zope/interface/declarations.py", line 285, in im 
    spec = cls.__dict__.get('__implemented__') 
RuntimeError: class.__dict__ not accessible in restricted mode 

उबंटू सटीक, 64 बिट नवीनतम अपाचे, mod_wsgi, पायथन 2.7, डेमॉन मोड में mpm_worker + mod_wsgi उपयोग करने के साथ: कि यह बहुत ही त्रुटि के साथ विफल सभी सर्वर अनुरोधों का 10% है। यह सर्वर पर चलने वाला एकमात्र प्रोग्राम है और कॉन्फ़िगरेशन में केवल एक wsgi दुभाषिया है। क्या यह mpm_worker की वजह से नए धागे या क्या है? सबसे महत्वपूर्ण बात - हम इसे कैसे ठीक कर सकते हैं।

हमारे पास कुकी पर आधारित 4 डिमन प्रक्रियाओं के अनुरोधों को उप-विभाजित करने के लिए निम्न है।

WSGIPythonOptimize 1 

WSGIDaemonProcess sticky01 processes=1 threads=16 display-name=%{GROUP} 
WSGIDaemonProcess sticky02 processes=1 threads=16 display-name=%{GROUP} 
WSGIDaemonProcess sticky03 processes=1 threads=16 display-name=%{GROUP} 
WSGIDaemonProcess sticky04 processes=1 threads=16 display-name=%{GROUP} 

<VirtualHost *:81> 
    ... 
    WSGIRestrictProcess sticky01 sticky02 sticky03 sticky04 
    WSGIProcessGroup %{ENV:PROCESS} 
    ... 

    WSGIScriptAlias//installation/dir/our-program/prod-dispatch.wsgi   
</VirtualHost> 

उत्तर

9

यह उम्र के लिए जाना जाता है कि एकाधिक सबइंटरप्रिटर सी एक्सटेंशन के साथ अच्छी तरह से नहीं खेलते हैं। हालांकि, मुझे यह नहीं पता था कि डिफ़ॉल्ट सेटिंग्स बहुत दुर्भाग्यपूर्ण हैं। ModWSGI wiki स्पष्ट रूप से कहा गया है कि WSGIApplicationGroup निर्देश के लिए डिफ़ॉल्ट मान% {संसाधन} प्रभाव जिनमें से होगा

The application group name will be set to the server hostname and port as for the %{SERVER} variable, to which the value of WSGI environment variable SCRIPT_NAME is appended separated by the file separator character.

मतलब यह है कि यह है कि प्रत्येक होस्ट के लिए है: हेडर कभी, जबकि सर्वर तक पहुंचने का सामना करना पड़ा mod_wsgi कृपया एक नया subinterpreter spawns , जिसके लिए सी एक्सटेंशन लोड हो जाते हैं। इस स्थानीय भविष्य की सभी आने वाले अनुरोधों के लिए विफल हमारे 4 WSGIDaemonProcesses की 1 के कारण सर्वर पर ब्राउज़र 81 के साथ लिंक:

मैं localhost.invalid एक्सेस करके त्रुटि अनजाने में ट्रिगर किया था।

सुम्मा summarum: हमेशा जब पिरामिड या किसी अन्य ढांचे सी एक्सटेंशन का उपयोग करता है के साथ mod_wsgi का उपयोग कर, यह सुनिश्चित करें कि WSGIApplicationGroup हमेशा% {वैश्विक} के लिए सेट है। दूसरे शब्दों में, डिफ़ॉल्ट सेटिंग्स का उपयोग करने का परिणाम आपको पैर में खुद को शूट करने का कारण बनता है, जिसके बाद आप अपने आप को सिर में भी शूट करना चाहते हैं।

+3

यह सभी सी एक्सटेंशन नहीं हैं जिनमें समस्याएं हैं, केवल कुछ ही हैं। कभी-कभी यह सी एक्सटेंशन में खराब कोडिंग के कारण होता है, दूसरी बार समस्या यह है कि वे पाइथन में थ्रेड स्टेटस को संभालने के लिए सरलीकृत API का उपयोग करते हैं। तो हालांकि एक डेमॉन प्रक्रिया समूह का उपयोग करना और मुख्य दुभाषिया के उपयोग को मजबूर करना अंगूठे का एक अच्छा नियम है, यह हमेशा आवश्यक नहीं होता है। –

+0

ठीक है, स्पष्टीकरण के लिए धन्यवाद। हालांकि, मुझे अभी भी लगता है कि% {RESOURCE} डिफ़ॉल्ट दुर्भाग्यपूर्ण है क्योंकि यह उसी वर्चुअल होस्ट में एक ही wsgi स्क्रिप्ट के लिए 2 subinterpreters बनाता है, भले ही इसे http://127.0.0.1 और http: // localhost दोनों के साथ एक्सेस किया जाए। यह बहुत जादू है। –

+1

% {RESOURCE} वर्चुअलहोस्ट से मिलान किए गए सर्वरनाम के मान का उपयोग करना चाहिए। यदि ऐसा नहीं होता है तो अपाचे कॉन्फ़िगरेशन परिभाषित करने के साथ कुछ समस्या है। –

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