Конфигурация Nginx для статических сайтов в корневом каталоге, приложения Flask в подкаталогах - PullRequest
13 голосов
/ 26 сентября 2011

Я бы хотел, чтобы в моем корневом каталоге public_html был статический сайт, а затем приложения Flask в их собственных подкаталогах (например, public_html / foo). Статический корневой каталог функционирует как положено.

Я потратил часы на редактирование конфигурации nginx, чтобы заставить работать приложения Flask, но всегда возвращался в одно и то же место, а именно, что следующий код всегда возвращает «Bad Config» при переходе на mysite / foo. Я хочу, чтобы он возвратил "Hello World!"

Если я изменю конфигурацию nginx так, чтобы корень сервера находился в public_html / foo, приложения Flask работали должным образом (то есть mysite.com возвращает «Hello World!»). В следующей конфигурации индекс Flask по-прежнему указывает на mysite.com, когда я считаю, что он должен указывать на mysite.com/foo

.

/ и т.д. / Nginx / сайты с поддержкой / MySite

upstream frontends {
# gunicorn
server 127.0.0.1:18000;
}

server {
listen 80;
server_name www.mysite.com;
rewrite ^/(.*) http://mysite.com$1 permanent;
}

server {
listen 80;
server_name mysite.com;
server_name_in_redirect off;
root /home/ubuntu/public_html/mysite;

access_log /home/ubuntu/logs/mysite/access.log;
error_log /home/ubuntu/logs/mysite/error.log;

location / {
    index index.html;
    }
location /foo {
    try_files $uri @foo;
    }
location @foo {
        proxy_pass http://frontends;
        break;
    }
}

/ дома / убунту / public_html / MySite / Foo / foo.py

from flask import Flask
from flask import render_template
app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World!'

@app.route('/foo')
def test():
    return 'Bad config'

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

if __name__ == '__main__':
    app.run()

/ дома / убунту / public_html / MySite / Foo / deploy.py

workers = 2
bind = '127.0.0.1:18000'
proc_name = 'foo_gunicorn'
pidfile = 'foo.pid'

Колба запускается с gunicorn -c deploy.py foo:app

Обновление

Добавление rewrite /foo/(.*) /$1 break; в блок nginx location /foo заставляет mysite / foo возвращать «Hello World», однако все его ссылки (например, ссылки на таблицу стилей из шаблона) по-прежнему указывают на корень сайта (например, mysite / static /style.css вместо mysite / foo / static / style.css)

1 Ответ

11 голосов
/ 27 сентября 2011

Получил ответ от mitsuhiko (Ведущий разработчик Flask): http://flask.pocoo.org/snippets/35/

Вам необходимо определить класс ReverseProxied в вашем приложении Flask и добавить несколько proxy-set-header строк в блок location /foo в nginx.конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...