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?

616   1  

1 ответ:

Файл fastcgi.conf должен иметь все необходимые параметры конфигурации. Вы также можете посмотреть на Директиву fastcgi_split_path_info.

Документация Nginx FastCGI .

Comments

    Ничего не найдено.