如何使用两个 nginx 作为 gunicorn/Django 的反向代理重写 URL

如何使用两个 nginx 作为 gunicorn/Django 的反向代理重写 URL

我有一个 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 解释。

如果有一个解决方案,后端不需要配置路径,那就太好了,也许可以通过将脚本名称从前端传递到后端,并对静态文件施展一些魔法。但是,嘿,它有效!

相关内容