nginx FastCGI-убрать префикс местоположения?
Я пишу веб-приложение на Python, используя web.py, spawn_fcgi и nginx.
Предположим, что у меня есть этот конфигурационный блок в 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 ответ:
Файл
fastcgi.confдолжен иметь все необходимые параметры конфигурации. Вы также можете посмотреть на Директивуfastcgi_split_path_info.
Comments