![mod-wsgi 一个守护进程用于具有不同 ServerNames 的多个 VirtualHosts](https://linux22.com/image/707180/mod-wsgi%20%E4%B8%80%E4%B8%AA%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E7%94%A8%E4%BA%8E%E5%85%B7%E6%9C%89%E4%B8%8D%E5%90%8C%20ServerNames%20%E7%9A%84%E5%A4%9A%E4%B8%AA%20VirtualHosts.png)
我有一个 apache2 / mod-wsgi 部署,它本质上是一个应用程序,为多个域提供服务。
所有域名均在端口 80 和 443 上提供服务。
因此,我的配置看起来像这样:
<VirtualHost *:80>
#ServerName www.example.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
WSGIDaemonProcess example processes=2 threads=12 python-path=/app_path
WSGIProcessGroup example
WSGIScriptAlias / /scripthome
......
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
Redirect permanent / http://www.example.com/
</virtualHost>
<VirtualHost _default_:443>
ServerName www.example.com
ErrorLog ${APACHE_LOG_DIR}/error_easyset_ssl.log
CustomLog ${APACHE_LOG_DIR}/access_easyset_ssl.log combined
WSGIDaemonProcess example_ssl processes=2 threads=12 python-path=/app_path
WSGIProcessGroup example_ssl
WSGIScriptAlias / /scripthome
SSLEngine on
........
</VirtualHost>
将此复制粘贴到所有其他域,我们最终会得到一个运行许多守护进程的服务器,而实际上只有一个应用程序。请注意,特定于域的逻辑是在应用程序中处理的,因此除 SSL 证书文件的路径外,所有其他域配置文件都是相同的。在需要 SSL 之前,整个系统只有一个 VirtualHost。从上面的配置摘录中可以看出这一点,因为我仍然对所有域的所有端口 80 请求使用一个 VirtualHost(ServerName 已注释掉)。
现在,这浪费了服务器资源,所以我开始研究文档在如何补救这个。以下是相关部分(靠近页面末尾WSGIDaemonProcess
):
如果 WSGIDaemonProcess 指令是在所有虚拟主机容器之外指定,任何 WSGI 应用程序都可以委托在该守护进程组内运行。如果指定了 WSGIDaemonProcess 指令在虚拟主机容器内,只有与具有与该虚拟主机相同服务器名称的虚拟主机关联的 WSGI 应用程序才可以被委托给该组守护进程。
现在,SSL 显然阻止我使用第二个加粗部分,但它允许我使用第一个部分。
我的问题是我不知道如何使用第一个。如何在VirtualHost
块之外指定 mod-wsgi 配置?
答案1
您可以在 apache 配置的 mods-enabled 子目录中的 wsgi 模块的 wsgi.conf 文件中配置 WSGIDaemonProcess 指令以及其他指令。
所以它应该类似于 /etc/apache2/mods-enabled/wsgi.conf