nginx FastCGI剥离位置前缀?

时间:2015-06-04 03:02:43

标签: nginx fastcgi web.py

我正在使用web.py,spawn_fcgi和nginx在Python中编写Web应用程序。

假设我在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?

1 个答案:

答案 0 :(得分:1)

fastcgi.conf文件应该包含您需要的所有配置选项。您可能还想查看fastcgi_split_path_info指令。

Nginx FastCGI documentation