2012-05-11 14 views
8

Bu, üretim sunucumuzdaki kıçımızı ısırmaya başladı. Bunu arada sırada gördük (haftada 1 talep için). Geri döndükten sonra mod_wsgi'nin bazı yapılandırmalarda bazı garip şeyler yapmasından kaynaklandığını öğrendik. Böceğin nedenini izleyemediğimizden, anlık ilgi gerektirmediğine karar verdik.mod_wsgi error - class .__ dict__ kısıtlı modda erişilemiyor

Ancak, bugün, üretim sunucularımızdan 1 tanesi bu, tüm sunucu taleplerinin% 10'u için gerçekleşti; En son Apache, mod_wsgi, Python 2.7, cini modunda mpm_worker + mod_wsgi kullanarak,

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 

Ubuntu Hassas, 64bit: bu aynı hatası ile tüm sunucu istekleri% 10 olduğunu. Bu, sunucu üzerinde çalışan tek program ve yapılandırmada sadece bir wsgi yorumlayıcısı var. Bu mpm_worker yeni iş parçacığı yumurtlama ya da ne yüzünden mi? Daha da önemlisi - bunu nasıl düzeltiriz?

Bir cookie'ye dayanarak 4 daemon işlemlerine istekleri alt gruplara ayırmak için aşağıdakilere sahibiz.

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> 

cevap

9

Çok sayıda alt yazıcının C uzantıları boyunca iyi oynamadıkları çağlar bilinmektedir. Ancak, fark etmediğim şey, varsayılan ayarların çok talihsiz olduğudur. sunucuyu erişirken hiç karşılaştı başlığındaki mod_wsgi nazik yeni subinterpreter getirir: WSGIApplicationGroup direktifinin için varsayılan değer% {KAYNAK}

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.

Bu, her Host için anlamına geldiğini kalacakları etkisini olduğunu ModWSGI wiki açıkça belirtmektedir C uzantıları daha sonra yüklenir. 81 bağlarının tarayıcı gelecekteki tüm gelen istekleri için başarısız bizim 4 WSGIDaemonProcesses 1. neden bu yerel sunucuda:

Ben localhost.invalid erişerek hatayı tetikleyen bilmeden almıştı.

toplamı summarum: her zaman WSGIApplicationGroup zaman% {KÜRESEL} ayarlanmış olduğundan emin olun, piramit veya C uzantıları kullanan başka bir çerçeve mod_wsgi kullanılmıştır. Diğer bir deyişle, varsayılan ayarların kullanılmasının sonucu kendinizi ayağınızda vurmanıza neden olacak, daha sonra kendinizi başınıza çekmek isteyebilirsiniz.

+3

Sorunların olduğu sadece C değil, yalnızca belirli olanları. Bazen bu, C uzantılarındaki kötü kodlama nedeniyle, diğer zamanlarda sorunun Python'daki iş parçacığı durumlarını işlemek için basitleştirilmiş API kullanmasıdır. Bu nedenle, bir daemon süreç grubu kullanmak ve ana yorumlayıcının kullanımını zorlamak iyi bir kuraldır, ancak her zaman gerekli değildir. –

+0

Tamam, açıklama için teşekkürler. Ancak, yine de, http://127.0.0.1 ve http: // localhost ile erişirken bile, aynı sanal ana makinede aynı wsgi betiği için 2 altyazıcı yarattığı için% {RESOURCE} varsayılanının talihsiz olduğunu düşünüyorum. Bu çok sihir. –

+1

% {RESOURCE}, eşleştiği VirtualHost'dan ServerName değerini kullanmalıdır. Eğer o değilse, Apache konfigürasyonu ile ilgili bir sorun var demektir. –