mod_wsgi:共享虚拟主机之间的守护进程

我有许多站点都使用相同的5 Django应用程序(本地设置),托pipe在Apache上。 目前每个网站的应用程序都有自己的configuration如下:

WSGIDaemonProcess api_example threads=15 maximum-requests=2000 WSGIProcessGroup api_example WSGIScriptAlias /api /var/www/sites/example/api/site.wsgi 

是否有可能在虚拟主机之间共享守护进程,但保持本地设置处于活动状态? 我的目标是节省内存,并减less启动服务请求的Apache进程的数量(其中几个应用程序是仅偶尔使用的pipe理/支持控制台)。

– 编辑 –

正如Graham Dumpleton在这里提出的: mod_wsgi守护进程模式 – WSGIDaemonProcess每个虚拟主机configuration? ,应该有可能“超越先前虚拟主机中的守护进程定义,因为它具有相同的服务器名称”。 请注意,正如Graham指出的那样,WSGIApplicationGroup指令必须从默认值调整为%{GLOBAL}或%{ENV:variable}。

我不确定如何在虚拟主机中“使用”服务器级别的声明。 是否有可能使用服务器级守护进程与本地设置?

上述问题的答案总结为:

  1. 是否有可能在虚拟主机之间共享wsgi守护进程?
  2. 是否有可能保持每个虚拟主机中的每个应用程序分离(共享守护进程),以便本地设置生效?
  3. 如果1.和2.是可能的,可以重启/closures守护进程来节省内存吗?

以上所有答案都是肯定的

以下是一个configuration示例,以Debian的apache2configuration为例:

 ... # Include definition of wsgi_daemons above the vhost configs Include /etc/apache2/wsgi_daemons/ # Include the virtual host configurations: Include /etc/apache2/sites-enabled/ ... 

定义一些wsgi守护进程,例如:

 WSGIDaemonProcess wsgi_support threads=5 \ display-name=wsgi_support inactivity-timeout=600 

在您的虚拟主机configuration中,沿着以下几行定义一个块:

 <Location /support/console> WSGIProcessGroup wsgi_support WSGIApplicationGroup <this_vhost>_support # WSGIApplicationGroup %{GLOBAL} does not work!!! </Location> WSGIScriptAlias /support/ /var/www/<this_vhost>/support/site.wsgi 

这是什么:

  • 当Apache启动/重新启动时,将启动一个名为“wsgi_support”的守护进程
  • 当访问<this_vhost>的支持应用程序时,它将附加到wsgi_support守护进程,因为这是由WSGIProcessGroup指令定义的
  • 为了确保应用程序的<this_vhosts>副本在其自己的命名空间中运行(如果您正在运行Django应用程序,这是非常重要的,因为设置仅在启动时进行计算),则会为vhost提供自己的WSGIApplicationGroup。 这使得主守护进程为<this_vhost>的应用产生一个子解释器。
  • 最后,timeout指令导致守护进程在指定的非活动时间后重新启动,释放子parsing器使用的内存。 这对于诸如支持控制台的less用应用程序是完美的。

请阅读http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives上的优秀文档&#x3002;

最初有两件事让我感到沮丧:没有在正确的位置定义wsgi_daemons(这非常愚蠢),也没有意识到WSGIProcessGroup指令指向WSGIDaemonProcess定义。