2013-03-25 39 views
3

我們有一個託管設置,我們有一個頂級域名,我們在子路徑下託管Web應用程序。例如:在子路徑下託管金字塔webapps

 
    /projects -> Plone 
    /interal -> Tomcat 
    etc 

在這種情況下,我們需要一種方法來告訴在後端其基本路徑是什麼樣的Web應用程序,以便它可以正確地生成鏈接到其觀點和靜態內容。對於上面的例子,這很好。

我們剛剛開始使用金字塔服務的女服務員,但到目前爲止,我們還沒有弄清楚如何做到這一點。有沒有一種乾淨的方式在Waitress中配置這個基本路徑,還是有更靈活的應用服務器,我們可以使用它支持金字塔?

+1

我假設你正在使用不同的前置Web服務器來代理所有這些path-> appserver請求?對此做一個理想的路徑修剪可能是最容易的。 – TML 2013-03-25 05:20:55

回答

5

WSGI中的所有內容都與當前請求有關。您只需要正確設置environ(通常由您的WSGI服務器)。

例如,您的Web應用程序將知道它被安裝在子路徑/projects如果request.environ['SCRIPT_NAME'] == '/projects'。如果你希望你的應用程序對它的掛載點不可知,你可以簡單地將它編碼爲/foo/bar。然後你通過一些中間件將你的應用程序安裝在/projects上,這些中間件可以正確改變environ(mod_wsgi和其他一些服務器應該可以自動爲你做這件事)。現在,當傳入的URL是/projects/foo/bar,environ['SCRIPT_NAME'] == '/projects'environ['PATH_INFO'] == '/foo/bar',並且您的應用可以專注於相對路徑。

在金字塔中,這將歸結爲您的ini中的一個額外步驟,即將前綴中間件添加到WSGI堆棧。中間件爲您處理environ中的PATH_INFOSCRIPT_NAME鍵。

[app:myapp] 
use = egg:myapp 

# ... 

[filter:proxy-prefix] 
use = egg:PasteDeploy#prefix 
prefix = /projects 

[pipeline:main] 
pipeline = 
    proxy-prefix 
    myapp 
+0

謝謝,很明顯,我需要了解更多關於WSGI的知識,並超越僅僅遵循食譜。我也曾經建議我可以(或者)在流水線上使用egg:repoze.vhm#vhm_path。 – Nigel 2013-03-26 02:04:45

+0

VHM僅適用於遍歷,並且有一些警告,如主要用於*生成*網址。但是,當然,這可能是另一個選擇。 – 2013-03-26 05:42:00

0

在我的金字塔的應用程序,在.ini配置文件(生產和開發)我在做這樣的事情:

filter-with = urlprefix 

[filter:urlprefix] 
use = egg:PasteDeploy#prefix 
prefix = /mysubfolder 

我想大概完成同上邁克爾的回答;我對金字塔還是比較陌生的,並且正在走出像你這樣的食譜。但最終的結果是,它從我的根目錄創建了一個/ mysubfolder的基本URL,其餘應用程序與此相關。這是在本地運行,我認爲我的虛擬主機上的nginix。

0

repoze.vhm應該適用於您的用例。

我認爲如果你想使用虛擬根功能,它不會工作。即你代理的web應用程序的子路徑(https://hidden.tld/root/應顯示爲https://example.com/

對於在外部域repoze.vhm的子路徑暴露你的應用程序工作得很好。國際海事組織最好的事情是,你不需要將任何子路徑配置或任何你的Web應用程序部署。這使您可以將url更改爲代理上的任何內容,甚至可以在多個域名和/或子路徑中公開相同的應用程序實例。