2015-06-04 3 views
3

Я пишу веб-приложение на 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?

ответ

2

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

Nginx FastCGI documentation.

+0

Точно, что мне нужно - спасибо! – fdmillion

+0

У меня есть именно эта проблема: @fdmillion mind, рассказывающий мне, что именно вы установили как fastcgi_split_path_info? – ttiurani