Nginx配置:根目录静态站点,子目录Flask应用

13 投票
1 回答
7587 浏览
提问于 2025-04-17 03:07

我想在我的根目录 public_html 下放一个静态网站,然后在它的子目录里放 Flask 应用(比如 public_html/foo)。静态根目录的功能正常。

我花了好几个小时在修改 nginx 的配置,想让 Flask 应用正常工作,但总是回到同样的问题,也就是当我访问 mysite/foo 时,下面的代码总是返回 'Bad Config',我希望它能返回 'Hello World!'。

如果我把 nginx 的配置改成让服务器根目录在 public_html/foo,Flask 应用就能正常工作(也就是说 mysite.com 会返回 'Hello World!')。但在下面的配置中,Flask 的首页仍然指向 mysite.com,我觉得它应该指向 mysite.com/foo。

/etc/nginx/sites-enabled/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'

Flask 是用 gunicorn -c deploy.py foo:app 启动的。

更新

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

1 个回答

12

从Flask的主要开发者mitsuhiko那里得到了一个答案:

你需要在你的Flask应用里定义一个叫做ReverseProxied的类,并且在nginx的配置文件中,给location /foo这个部分添加几行proxy-set-header的设置。

撰写回答