如何在單個 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。
如果我想添加另一個站點或需要進行更改,目標是必須創建/更改更少的文件。
根據回饋(感謝 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。