nginx FastCGI-去掉位置前缀?
nginx FastCGI-strip off the location prefix?
我正在使用 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 框架在确定执行哪个 class 时将使用此位置。例如:
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
。 :-)
我希望该应用程序可以重新定位,因为将其安装在其他服务器上可能需要这样做(例如,它必须与其他设备共享服务器)。坚持每个服务器都把它放在同一个 "virtual subdirectory" 中似乎也有点顽固。
现在,我的解决方法是做这样的事情:
URL_PREFIX = "/app" # the same as the nginx location parameter
urls = ( URL_PREFIX+"/api/.*",myClass )
这里的问题是 1) 这意味着仍然需要为每个站点编辑脚本(不一定可怕但至少不方便)和 2) URL_PREFIX
变量必须可以全局访问整个脚本集合 - 因为例如任何 class 或函数可能需要访问该位置,但它不需要包含前缀。
我正在使用自定义 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 中有更优雅的处理方式?
fastcgi.conf
文件应该有您需要的所有配置选项。您可能还想查看 fastcgi_split_path_info
指令。
我正在使用 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 框架在确定执行哪个 class 时将使用此位置。例如:
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
。 :-)
我希望该应用程序可以重新定位,因为将其安装在其他服务器上可能需要这样做(例如,它必须与其他设备共享服务器)。坚持每个服务器都把它放在同一个 "virtual subdirectory" 中似乎也有点顽固。
现在,我的解决方法是做这样的事情:
URL_PREFIX = "/app" # the same as the nginx location parameter
urls = ( URL_PREFIX+"/api/.*",myClass )
这里的问题是 1) 这意味着仍然需要为每个站点编辑脚本(不一定可怕但至少不方便)和 2) URL_PREFIX
变量必须可以全局访问整个脚本集合 - 因为例如任何 class 或函数可能需要访问该位置,但它不需要包含前缀。
我正在使用自定义 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 中有更优雅的处理方式?
fastcgi.conf
文件应该有您需要的所有配置选项。您可能还想查看 fastcgi_split_path_info
指令。