我有一个相当简单的问题。当 mod_wsgi 在守护进程模式下运行时,并且您在每个虚拟主机上启用WSGIDaemonProcess
和WSGIProcessGroup
指令时,其他虚拟主机是否也会获取这些指令?
例如,如果我有:
<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。
该扩展被用作上面的默认扩展的一部分。