2015-06-04 43 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