Я пишу веб-приложение на Python, используя web.py, spawn_fcgi и nginx.nginx FastCGI-strip с префикса местоположения?
Давайте предположим, что у меня есть этот конфигурационный блок в 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 (например, каталоги, содержащие инициализации .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?
Точно, что мне нужно - спасибо! – fdmillion
У меня есть именно эта проблема: @fdmillion mind, рассказывающий мне, что именно вы установили как fastcgi_split_path_info? – ttiurani