Web-Server

如何在單個 apache 伺服器上使用相同的程式碼實現多個站點?

  • January 6, 2020

我有一個用於服務網站的 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。

如果我想添加另一個站點或需要進行更改,目標是必須創建/更改更少的文件。

根據回饋(感謝 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 會將站點子部分合併到通用配置空間中。(使用支持小節和合併的ConfigObj最簡單)。

**問題:**需要編輯 site.py 以將其指向正確的配置文件。

**沒有好的解決方案:**可以在 httpd.conf 中設置一個由 site.py(或 sitesingle.py 或 sitemulti.py)讀取的環境變數

最簡單的方法是修改腳本為每個虛擬主機載入不同的配置文件。

由於您使用的是mod_cgi ,您的腳本會在環境變數中接收與 HTTP 請求相關的所有資訊。在所有 CGI 環境中都有一些標準 CGI 變數可用,Apache 添加了一些自己的變數

您所要做的就是讀取SERVER_NAME變數並相應地選擇您的配置,例如:

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

在 Apache 方面,您可以使用 default<VirtualHost>或 a<VirtualHost>與您需要的所有ServerAlias‘es。

編輯:重新閱讀您的問題後,您的網站似乎是同一 URL 空間的子目錄。因此,您需要檢查SCRIPT_NAME而不是SERVER_NAME

引用自:https://serverfault.com/questions/997563