我有一个 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 )读取