mod_wsgi的错误 - 类.__ dict__受限模式无法访问(mod_wsgi error -

2019-07-29 08:54发布

这开始咬我们的屁股我们的生产服务器上真的很难。 我们看到这个偶尔(每周1个请求)。 当时我们发现,这是因为的mod_wsgi的做一些时髦的东西在一些CONFIGS。 由于我们无法跟踪的bug的原因,我们决定,它并不需要即时关注。

但是今天,在我们的生产服务器这真的发生了所有服务器请求的10%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

Ubuntu的精密,64位,与最新的阿帕奇,mod_wsgi的,Python 2.7版,在守护进程模式下使用mpm_worker + mod_wsgi的。 这是服务器上运行的唯一程序,并且只有一个在配置WSGI解释。 这是因为mpm_worker产生新的线程或什么的? 更重要的是 - 我们如何解决它。

我们必须细分要求基于一个cookie 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>

Answer 1:

已经知道的年龄多个subinterpreters不沿C扩展打好。 不过,我没有意识到的是,默认的设置是非常不幸的。 ModWSGI维基明确指出,对于WSGIApplicationGroup指令的默认值是%{RESOURCE}这应是效果

应用程序组名称将被设置到服务器主机名和端口作为%{SERVER}变量,向其中WSGI环境变量SCRIPT_NAME的值被附加由文件分隔符分隔。

这意味着对于每个Host:头在访问mod_wsgi的好心产生一个新subinterpreter,那么C扩展加载的服务器遇到过。

这个本地服务器导致我们4个WSGIDaemonProcesses 1失败为将来所有传入请求在81与链接的浏览器:我已经在不知不觉中通过访问localhost.invalid引发的错误。

苏玛summarum: 总是使用mod_wsgi的金字塔用或使用C扩展,确保WSGIApplicationGroup总是被设置为%{}全球任何其他框架时 。 换句话说,使用默认设置的结果会导致你拍自己的脚,在这之后,你可能想搬起石头砸自己的头了。



文章来源: mod_wsgi error - class.__dict__ not accessible in restricted mode