Это стало очень сильно кусать нас за задницу на нашем производственном сервере. Мы видели это изредка (по 1 запросу в неделю). Тогда мы узнали, что это из-за того, что mod_wsgi делает некоторые странные вещи в некоторых конфигурациях. Поскольку мы не могли отследить причину бага, мы решили, что он не требует мгновенного внимания.
Однако сегодня на одном из наших производственных серверов это действительно произошло для 10 % всех запросов к серверу; то есть 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
Ubuntu Precise, 64-битная, с последними версиями Apache, mod_wsgi, Python 2.7, с использованием mpm_worker + mod_wsgi в режиме демона. Это единственная программа, работающая на сервере, и в конфиге есть только один интерпретатор wsgi. Это из-за того, что mpm_worker порождает новые потоки или что? Что еще более важно - как мы это исправим.
У нас есть следующее, чтобы разделить запросы к 4 процессам демона на основе файла cookie.
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>