first_vm
我有一个 Flask 应用程序,目前正在使用以下命令在一台机器上提供服务(称之为) supervisord
:
gunicorn run:app -b 0.0.0.0:8002 -k socketio.sgunicorn.GeventSocketIOWorker --workers 1
此应用程序也是反向代理本地在端口上80
,nginx
这样http://first_vm/
将按预期为应用程序提供服务。
我想要做的是反向代理不同服务器(比如second_vm
)上的应用程序,这样通过点击就可以为http://second_vm/my_app
应用程序提供服务。gunicorn
first_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 之间的相对地址之类的操作。