Nginx配置为根目录中的静态站点,子目录中的Flask应用程序

时间:2011-09-26 16:34:41

标签: python nginx flask gunicorn

我想在我的root public_html目录中有一个静态站点,然后在他们自己的子目录中有Flask应用程序(例如public_html / foo)。静态根目录按预期运行。

我花了好几个小时编辑nginx配置以使Flask应用程序正常工作,但总是回到同一个地方,即当我迁移到mysite / foo时,以下代码总是返回'Bad Config'。我希望它返回'Hello World!'

如果我更改nginx配置以使服务器根位于public_html / foo中,Flask应用程序将按预期工作(即mysite.com返回'Hello World!')。在以下配置中,当我认为它应该指向mysite.com/foo时,Flask索引仍然指向mysite.com

的/ etc / 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;
    }
}

/home/ubuntu/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()

/home/ubuntu/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

启动Flask

更新

rewrite /foo/(.*) /$1 break;添加到nginx location /foo块会使mysite / foo返回'Hello World',但是其所有链接(例如模板中样式表的链接)仍然指向站点根目录(例如mysite / static / style.css而不是mysite / foo / static / style.css)

1 个答案:

答案 0 :(得分:11)

得到了mitsuhiko(Flask lead dev)的回答: http://flask.pocoo.org/snippets/35/

您需要在Flask应用中定义一个ReverseProxied类,并在nginx配置中的proxy-set-header块中添加几行location /foo行。