2015-06-04 76 views
3

我正在使用web.py,spawn_fcgi和nginx在Python中編寫Web應用程序。nginx FastCGI-剝離位置前綴?

比方說,我有這個配置塊nginx的:

location/{ 
    include fastcgi.conf; 
    fastcgi_pass 127.0.0.1:9001; 
} 

如果我再訪問,比方說,http://example.com/api/test,那麼FastCGI應用接收/api/test作爲其請求的位置。當確定要執行哪個類時,web.py框架將使用此位置。例如:

urls = ("/api/.*", myClass) 

如果我需要將此腳本放置在網站上的其他位置,則會出現問題。例如:

location /app { 
    include fastcgi.conf; 
    fastcgi_pass 127.0.0.1:9001; 
} 

現在,當我訪問http://example.com/app/api/test,FastCGI應用程序獲取/app/api/test作爲它的位置。

它當然可以位於任何地方:http://example.com/sloppy_admin/My%20Web%20Pages/app/api/test例如。 :-)

我希望應用程序可以重新定位,因爲在其他服務器上安裝它可能需要它(例如它必須與其他服務器共享服務器)。堅持每個服務器都將其放置在同一個「虛擬子目錄」中似乎有點頭疼。

現在,我的解決方法一直做這樣的事情:這裏

URL_PREFIX = "/app" # the same as the nginx location parameter 
urls = (URL_PREFIX+"/api/.*",myClass) 

的問題是:1),這意味着,腳本仍然需要每個站點(不一定是可怕的編輯,但在至少不方便); 2)URL_PREFIX變量必須全局可訪問整個腳本集 - 因爲例如任何類或函數都可能需要訪問該位置,但它不需要包含前綴。

我使用自定義python軟件包(例如包含init .py腳本的目錄)來簡化組成應用程序的不同腳本的管理,但問題是傳遞該URL_PREFIX參數。例如:

app.py:

from myapp import appclass 
import web 

URL_PREFIX = "/app" # the same as the nginx location parameter 
urls = (URL_PREFIX+"/api/.*",appclass.myClass) 
app = web.application(urls,globals()) 
if __name__ == "__main__": 
    web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr) 
    app.run() 

MYAPP/appclass.py:

class myClass: 
    def GET(self): 
     global URL_PREFIX # this does not work! 
     return URL_PREFIX 

是否有任一種nginx的參數,以使發送到FastCGI的是相對於所述位置的路徑,或更好的方式來處理這個在web.py?

回答

2

fastcgi.conf文件應該有你需要的所有配置選項。您可能還想看看fastcgi_split_path_info指令。

Nginx FastCGI documentation

+0

正是我需要的 - 謝謝! – fdmillion

+0

我有這個問題:@fdmillion心裏告訴我,你設置爲fastcgi_split_path_info的是什麼? – ttiurani