PyMongo和modwsgi#

在下运行您的应用程序 mod_wsgi ,请遵循以下指导原则:

  • mod_wsgi 在守护程序模式下 WSGIDaemonProcess 指令。

  • 为每个应用程序分配一个单独的守护进程 WSGIProcessGroup .

  • 使用 WSGIApplicationGroup %{{GLOBAL}} 以确保应用程序在守护进程的主Python解释器中运行,而不是在子解释器中运行。

例如,这个 mod_wsgi 配置确保应用程序在主解释器中运行:

<VirtualHost *>
    WSGIDaemonProcess my_process
    WSGIScriptAlias /my_app /path/to/app.wsgi
    WSGIProcessGroup my_process
    WSGIApplicationGroup %{GLOBAL}
</VirtualHost>

如果您有多个使用PyMongo的应用程序,请将每个应用程序放在一个单独的守护程序中,仍然位于全局应用程序组中:

<VirtualHost *>
    WSGIDaemonProcess my_process
    WSGIScriptAlias /my_app /path/to/app.wsgi
    <Location /my_app>
        WSGIProcessGroup my_process
    </Location>

    WSGIDaemonProcess my_other_process
    WSGIScriptAlias /my_other_app /path/to/other_app.wsgi
    <Location /my_other_app>
        WSGIProcessGroup my_other_process
    </Location>

    WSGIApplicationGroup %{GLOBAL}
</VirtualHost>

背景: mod_wsgi 当只设置了WSGIScriptAlias时,可以在“嵌入式”模式下运行,或者在WSGIDaemonProcess中以“守护程序”模式运行。在守护程序模式下, mod_wsgi 可以在Python主解释器或子解释器中运行应用程序。运行PyMongo应用程序的正确方法是在守护程序模式下,使用主解释器。

通常,在多个Python子解释器中运行时,PythonC扩展都会出现问题。这些困难在的文档中进行了解释 Py_NewInterpreter 而在 Multiple Python Sub Interpreters 部分的 mod_wsgi 文件。

从pymongo2.7开始,BSON的C扩展可以检测它何时在子解释器中运行,并激活一个变通方法,这会给BSON解码增加一个小成本。为了避免这种成本,使用 WSGIApplicationGroup %{{GLOBAL}} 以确保应用程序在主解释器中运行。

由于您的程序在主解释器中运行,因此它不应该与任何其他应用程序共享其进程,以免它们干扰彼此的状态。每个应用程序都应该有自己的守护进程,如上面的示例所示。