nginx - 多个 django 应用程序相同的域不同的 URL

Posted

技术标签:

【中文标题】nginx - 多个 django 应用程序相同的域不同的 URL【英文标题】:nginx - multiple django apps same domain different Urls 【发布时间】:2019-05-09 08:20:12 【问题描述】:

我想在一个域上为多个 django 项目(实际上是 django rest API 应用程序)提供服务,但在单独的 url 上为每个项目提供服务。像这样:

    http://test.com/app1/... http://test.com/app2/...

等等。我将使用 nginx 来配置它。但是我遇到了一些需要您帮助的问题:

    这些应用程序之间应该有不同的 cookie。因为他们有不同的身份验证系统。所以一个令牌和cookie对另一个无效。如何处理? 您推荐的 nginx 配置。

注意:

我不想要完整的细节,因为我知道概念。只需一些提示和有用的命令即可。

更新:

例如,我有一个 django 应用程序,其 url 为 test。我希望这条路径在服务器上以/app1/test 提供服务。问题是当向/app1/test 发送请求时,Django 不会将其识别为/test,而是将其识别为/app1/test,并且因为/app1 未在urls.py 中注册会给出404 错误。

这是我的 nginx 配置示例:

server 
listen 80;
server_name test.com;

location /qpp1/ 
    include uwsgi_params;
    proxy_pass http://unix://home//app1.sock;


location /qpp2/ 
    include uwsgi_params;
    proxy_pass http://unix://home//app2.sock;


【问题讨论】:

【参考方案1】:

因为我没有使用nginx,django 的SESSION_COOKIE_PATH-Variable 是我的解决方案。

https://docs.djangoproject.com/en/3.1/ref/settings/#session-cookie-path

在您的示例中,您可以将其设置为:

应用程序1

SESSION_COOKIE_PATH = "/app1/"

app2

SESSION_COOKIE_PATH = "/app2/"

然后清除浏览器中域的 cookie 缓存(如果您之前登录过)。

【讨论】:

【参考方案2】:

你可以试试proxy_cookie_path指令:

server 

    ...

    location /app1/ 
        proxy_cookie_path / /app1/;
        proxy_pass http://backend1/;
    

    location /app2/ 
        proxy_cookie_path / /app2/;
        proxy_pass http://backend2/;
    

更新

这是要测试的另一种配置变体。

upstream qpp1 
    server unix:/home/.../app1.sock;


upstream qpp2 
    server unix:/home/.../app2.sock;


server 
    listen 80;
    server_name test.com;

    location /qpp1/ 
        include uwsgi_params;
        proxy_cookie_path / /qpp1/;
        proxy_pass http://qpp1/;
    

    location /qpp2/ 
        include uwsgi_params;
        proxy_cookie_path / /qpp2/;
        proxy_pass http://qpp2/;
    

【讨论】:

问题是 django 不明白它的基本 url 已更改。例如,当我尝试获取 /app2/swagger 时,它会给出 404 错误。因为它从基本 url / 检查并看到没有注册 app2 url! http://backend1http://backend2 上添加一个斜线,查看更多信息here。我已经更新了我的答案。 没有问题,我猜来自 django。例如,如果 app1 是一个 django 应用程序,并且有一个 url /test,向 /app1/test 发送请求应该服务于 django 的 /test 路径,但 django 将此路径识别为 /app1/test 不可用并会出错。 我想我找到了问题所在。看来我也应该更改所有 django 网址的基本网址。并在它们之前添加一个 /app1 例如。 nginx 配置看起来不错。让我试试这个,让你知道答案 等一下,django 应用不用改了。似乎您还没有尝试在后端附加斜杠?这样做并测试您的配置,至少它将/app1/test 作为/test 传递给您的django 应用程序。我刚刚测试了这样的配置(后端在 tcp 端口,而不是 unix 套接字),它可以工作。将http://unix://home//app1.sock; 更改为http://unix://home//app1.sock/; 并尝试测试它。

以上是关于nginx - 多个 django 应用程序相同的域不同的 URL的主要内容,如果未能解决你的问题,请参考以下文章

如何避免使用 Django、nginx 和 uWSGI 将环境变量放到多个地方?

通过 Gunicorn/Nginx 使用 Django 的站点框架运行多个站点

ubuntu nginx 启动多个Django项目

Ubuntu18部署uwsgi+flask应用

使用 nginx 和 gunicorn 运行多个 django 项目

Django在多个项目之间共享相同用户模型和数据库的最佳方式