我有许多网站,每个网站都使用相同的 5 个 Django 应用程序(具有本地设置),托管在 Apache 上。目前,每个站点应用程序都有自己的配置,如下所示:
WSGIDaemonProcess api_example threads=15 maximum-requests=2000
WSGIProcessGroup api_example
WSGIScriptAlias /api /var/www/sites/example/api/site.wsgi
是否可以在虚拟主机之间共享守护进程,但保持本地设置处于活动状态?我的目标是节省内存,并减少为服务请求而启动的 Apache 进程数量(这些应用程序中有几个是仅偶尔使用的管理/支持控制台)。
- 编辑 -
正如 Graham Dumpleton 所述:mod_wsgi 守护进程模式-每个虚拟主机配置的 WSGIDaemonProcess?,应该可以“只要它有相同的服务器名称,就可以到达先前虚拟主机中的守护进程定义。”请注意,正如 Graham 指出的那样,WSGIApplicationGroup 指令必须从默认值进行调整,可能调整为 %{GLOBAL} 或 %{ENV:variable}。
我不确定如何在虚拟主机中“使用”服务器级声明。是否可以使用具有本地设置的服务器级守护进程?
答案1
对上述问题的回答概括如下:
- 是否可以在 vhost 之间共享 wsgi 守护进程?
- 是否可以将每个虚拟主机中的每个应用程序分开(同时共享守护进程)以便本地设置生效?
- 如果 1. 和 2. 可行,是否可以重新启动/关闭守护进程以节省内存?
以上所有问题的答案是是的。
下面是一个示例配置,使用 Debian 的 apache2 配置作为示例:
...
# 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
在您的 vhost 配置中,定义一个如下所示的块:
<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>
应用程序生成一个子解释器。 - 最后,超时指令使守护进程在规定的不活动时间后重新启动,释放子解释器使用的内存。这对于支持控制台等很少使用的应用程序来说非常完美。
请阅读以下优秀文档http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives。
最初有两件事让我困惑:没有在正确的位置定义 wsgi_daemons(这非常愚蠢)并且没有意识到 WSGIProcessGroup 指令指向 WSGIDaemonProcess 定义。