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