mod_wsgi 守护进程模式-每个虚拟主机配置的 WSGIDaemonProcess?

mod_wsgi 守护进程模式-每个虚拟主机配置的 WSGIDaemonProcess?

我有一个相当简单的问题。当 mod_wsgi 在守护进程模式下运行时,并且您在每个虚拟主机上启用WSGIDaemonProcessWSGIProcessGroup指令时,其他虚拟主机是否也会获取这些指令?

例如,如果我有:

<VirtualHost *:80>
WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup example.com
</VirtualHost>

<VirtualHost *:443>
WSGIProcessGroup example.com
</VirtualHost>

第二个 443 虚拟主机是否会使用第一个 80 虚拟主机中定义的现有“example.com”进程组?还是我必须在第二个 443 虚拟主机中重新定义一个单独的进程组?

答案1

引用文档:

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess

行为是:

如果在所有虚拟主机容器之外指定了 WSGIDaemonProcess 指令,则可以委托任何 WSGI 应用程序在该守护进程组内运行。如果在虚拟主机容器内指定了 WSGIDaemonProcess 指令,则只有与该虚拟主机具有相同服务器名称的虚拟主机关联的 WSGI 应用程序才能委托给该组守护进程。

因此,只要服务器名称相同,您就可以跨越先前的虚拟主机中的守护进程定义。

您还需要了解以下内容:

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIApplicationGroup

WSGIApplicationGroup 的默认值(即,如果未指定)为:

%{资源}

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

例如,如果虚拟主机 www.example.com 正在处理端口 8080 上的请求,并且映射到 WSGI 应用程序的 URL 路径是http://www.example.com/wsgi-scripts/foo,则应用程序组名称将设置为 www.example.com:8080|/wsgi-scripts/foo。

使用 %{RESOURCE} 变量扩展的效果是,通过映射到其自己的 Python 子解释器,任何服务器上的每个应用程序都与所有其他应用程序隔离。

因此,通常情况下,如果您在两个虚拟主机中为不同端口的相同挂载点设置了单独的 WSGIScriptAlias,则两个应用程序实例仍然会通过在不同的子解释器中运行来分开。

不过,对于端口 80/443 的情况,此规则有一个例外,即端口实际上不包含在应用程序组名称中。因此,在这种情况下,挂载在同一挂载点的应用程序将在同一个子解释器中运行。

这个异常可能没有得到清楚的解释,但是定义涵盖了它:

%{服务器}

应用程序组名将设置为服务器主机名。如果请求通过非标准 HTTP/HTTPS 端口到达,端口号将作为后缀添加到组名中,并以冒号分隔。

例如,如果虚拟主机 www.example.com 正在处理标准 HTTP 端口 (80) 和 HTTPS 端口 (443) 上的请求,则到达任一端口的请求都会看到应用程序组名称被设置为 www.example.com。如果虚拟主机正在处理端口 8080 上的请求,则应用程序组名称将设置为 www.example.com:8080。

该扩展被用作上面的默认扩展的一部分。

相关内容