如何在单个 Apache 服务器上使用相同的代码实现多个站点?

如何在单个 Apache 服务器上使用相同的代码实现多个站点?

我有一个 mod_cgi 代码“site.py”,用于为网站提供服务。我在一台 Apache 服务器上运行此网站的多个实例,每个实例都有自己的配置文件。

目前我的 apache 配置(httpd.conf)包含

ScriptAlias /siteA /path/to/mainA.py # loads configA.txt then runs site.py
ScriptAlias /siteB /path/to/mainB.py # loads configB.txt then runs site.py
ScriptAlias /siteC /path/to/mainC.py # loads configC.txt then runs site.py
. . .

有没有更好的方法来拥有多个这样的网站?最好有一种方法可以避免每个网站都有一个 httpd.conf 条目和/或不需要每个网站都有一个 mainX.py。

目标是,如果我想添加另一个站点或者需要进行更改时,只需创建/更改更少的文件。

答案1

最简单的方法是修改脚本以便为每个虚拟主机加载不同的配置文件。

由于您正在使用mod_cgi你的脚本接收与 HTTP 请求相关的所有信息环境变量。 有一些标准 CGI 变量适用于所有 CGI 环境和 Apache 添加一些自身的变量

你所要做的就是阅读服务器名称变量并相应地选择您的配置,例如:

config_file = 'config-' + os.environ['SERVER_NAME'] + '.txt'
if not os.path.exists(config_file):
    config_file = 'config-default.txt'

在 Apache 方面,您可以使用默认值<VirtualHost>,或者使用<VirtualHost>包含所有ServerAlias您需要的版本。

编辑:重新阅读您的问题后,似乎您的网站是同一 URL 空间的子目录。因此您需要检查脚本名称代替服务器名称

答案2

根据反馈(感谢 Piotr)和进一步的研究,这是我想到的最好的办法。我仍然希望找到“你应该如何做这件事”,并希望得到任何进一步的意见。

问题:httpd.conf 条目过多

解决方案:单次入境

ScriptAliasMatch ^/site(.*) "/path/to/site.py"

也许发布两个版本的代码sitesingle.py和sitemulti.py。

问题:每个站点都有一个 siteX.py 版本。

解决方案:让 site.py(或 sitemulti.py)查看环境变量 SCRIPT_NAME 来确定要服务的站点实例。

问题:配置文件太多。

解决方案:有一个包含每个站点的子部分的配置文件,如下例所示:

[path]
    datapath = /path/to/generic/data
    pythonpath = /pythonpath/for/all/sites

[sitea]
    [[path]]
        datapath = /path/to/siteA/data

site.py 将把站点子部分合并到通用配置空间中。(最简单的方法是配置对象支持小节和合并)。

问题:需要编辑 site.py 以将其指向正确的配置文件。

没有好的解决方案:可以在 httpd.conf 中设置一个环境变量,该变量由 site.py (或 sitesingle.py 或 sitemulti.py )读取

相关内容