使用 gunicorn 和 nginx 代理 Flask 应用

使用 gunicorn 和 nginx 代理 Flask 应用

first_vm我有一个 Flask 应用程序,目前正在使用以下命令在一台机器上提供服务(称之为) supervisord

gunicorn run:app -b 0.0.0.0:8002 -k socketio.sgunicorn.GeventSocketIOWorker --workers 1

此应用程序也是反向代理本地在端口上80nginx这样http://first_vm/将按预期为应用程序提供服务。

我想要做的是反向代理不同服务器(比如second_vm)上的应用程序,这样通过点击就可以为http://second_vm/my_app应用程序提供服务。gunicornfirst_vm:8002

这是我当前的 nginx 配置second_vm

location /my_app {
    proxy_pass http://first_vm:8002/;

    proxy_set_header   Host $host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Host $server_name;
}

此配置工作正常,因为它可以在 上为我的应用程序提供服务http://second_vm/my_app,但静态文件(例如 JS/CSS)无法正确提供,因为浏览器尝试从http://second_vm/而不是 上获取它们http://second_vm/my_app

例如,Chrome 会告诉我Failed to load resource: the server responded with a status 404以下情况:

http://second_vm/blueprint/static/css/bootstrap.min.css   <-- what Chrome fails to fetch
http://second_vm/my_app/blueprint/static/css/bootstrap.min.css   <-- what it should fetch

有人能帮助我完成这项工作吗?

答案1

经过多次尝试和磨难后,我发现了一篇博客文章,它也为我解决了这个问题。http://albertoconnor.ca/blog/2011/Sep/15/hosting-django-under-different-locations它提到了 Django,但除此之外,它是相同的软件(即 gunicorn 和 nginx),并且修复方法与根本原因相同。

编辑:

本质上,flask 应用程序缺少 SCRIPT_NAME 标头,该标头告诉它应用程序所在的位置,因此添加 proxy_set_header SCRIPT_NAME /my_app;是第一次启动,但随后您还需要修复重定向,因为还有一些后台 URL 修复,因此proxy_redirect http://first_vm:8002/my_app http://$host/my_app;应该阻止它执行诸如返回 first_vm 和 second_vm 之间的相对地址之类的操作。

相关内容