我有一个 Django 应用程序,使用 gunicorn 部署在端口 8000 上,该 VM 上有一个后端 nginx,端口 80,位于同一 VM 上。nginx 配置为:
location / {
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://localhost:8000/;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header REMOTE_USER $remote_user;
}
location /static/ {
}
在前端,还有另一个 nginx,端口 443,将用户可见的 URL 转换https://myserver.com/myapplication/
为内部的http://myvm/
。nginx 配置为:
location /myapplication/ {
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://myvm/;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header REMOTE_USER $remote_user;
}
虽然我可以毫无问题地访问任何 URL https://myserver.com/myapplication/
,但 Django 应用程序中的链接都缺少/myapplication/
路径组件。我的 nginx 设置有什么问题?是前端还是后端有问题?
答案1
前端配置没问题,但后端需要更改:
location / {
...
proxy_set_header SCRIPT_NAME /myapplication;
}
location /myapplication/static/ {
alias /path/to/myapplication/static/;
}
相关位设置SCRIPT_NAME
似乎由 Django 解释。
如果有一个解决方案,后端不需要配置路径,那就太好了,也许可以通过将脚本名称从前端传递到后端,并对静态文件施展一些魔法。但是,嘿,它有效!