błąd mod_wsgi - klasa .__ dict__ niedostępna w trybie ograniczonym
To zaczęło bardzo mocno gryźć nasz tyłek na naszym serwerze produkcyjnym. Widzieliśmy to od czasu do czasu (za 1 prośbę na tydzień). Wtedy dowiedzieliśmy się, że jest to spowodowane tym, że mod_wsgi robi jakieś fajne rzeczy w niektórych konfiguracjach. Ponieważ nie mogliśmy śledzić przyczyny błędu, zdecydowaliśmy, że nie wymaga on natychmiastowej uwagi.
Jednak dzisiaj na jednym z naszych serwerów produkcyjnych wystąpiło to w 10% wszystkich żądań serwera; czyli 10% wszystkich żądań serwera nie powiodło się z tym samym błędem:
<code>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 </code>
Ubuntu Precise, 64bit, z najnowszym Apache, mod_wsgi, Python 2.7, z użyciem mpm_worker + mod_wsgi wdemon tryb. Jest to jedyny program działający na serwerze i tylko jeden interpreter wsgi w konfiguracji. Czy to dlatego, że mpm_worker tworzy nowe wątki lub co? Co ważniejsze - jak to naprawić.
Aby podzielić żądania na 4 procesy demona w oparciu o plik cookie, musimy wykonać następujące czynności.
<code>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> </code>