【问题标题】:multiple django apps with nginx proxy_pass and rewrite使用 nginx proxy_pass 和重写的多个 django 应用程序
【发布时间】:2012-09-03 20:34:02
【问题描述】:

我有一个名为 myapp 的 django-admin 应用程序,我想在不同的物理盒子上部署多个实例,每个客户一个。但是,我希望它们都可以从类似的域mydomain.com/customer1/myapp 访问。

我已经摆弄了特定的代理设置并尝试了 SO 上建议的多种方法,但没有一种完全适合我的用例……而且由于我对 nginxdjango 都知之甚少,我不知所措!

我当前的 nginx.conf 是:

server {
    listen 80;
    server_name myserver.com

    location ^~ /static {
        alias /path/to/static/files/;
    }
#    location / {
#        proxy_pass http://127.0.0.1:8001;
#    }
    location ^~ /customer1/myapp/static {
        alias /path/to/static/files/;
    }
    location /customer1/myapp {
        rewrite ^/customer1/myapp/(/?)(.*) /$2 break;
        proxy_pass http://127.0.0.1:8001;
    }
}

我可以通过myserver.com/customer1/myapp/admin 按预期进入登录屏幕。但是,当我尝试登录时,nginx 会将我的 url 重写为 myserver.com/admin,这不是有效的 url。如何防止 nginx 实际重写 url,而只更改传递给 127.0.0.1:8001 的 url?

FWIW,我正在使用 gunicorn 服务于 gunicorn -b 127.0.0.1:8001 -n myapp。如果我取消注释 / 位置并删除最后两个位置块,该应用程序运行良好。

如果有其他选择,我远未确定这种方法。目标是避免为每个部署修改 django 代码,而只需在 nginx.conf 中添加最少的代码以进行新部署。

【问题讨论】:

  • 关于部署的问题可能更适合serverfault.com
  • 我不明白,你只是想让 django url 反向生成 /customerX/myapp/admin/ 而不是 /admin/ 吗?
  • @jpic 不,我希望 django 只看到根 url。例如127.0.0.1:8001/admin。我想我可以用 nginx 做到这一点,但我不知道怎么做。并注意到serverfault.com,如果我在这里没有找到任何东西,我会在那里发布,谢谢。

标签: django url-rewriting nginx django-admin


【解决方案1】:

您应该使用以下内容:

location /customer1/myapp {
    return 302 $uri/;
}
location /customer1/myapp/ {
    proxy_pass http://127.0.0.1:8001/
}

请注意,这比在proxy_pass 中使用变量要好,因为如果您确实使用变量,那么proxy_redirect 不能再是默认值default,而是off,然后是内部应用内的302重定向被nginx抓取后不会映射到/customer1/myapp/,这可能会给你带来麻烦和更多的404。

是的,为单个客户使用单个域是一个更好的主意,因为它更安全(例如,就 cookie 处理而言)。

【讨论】:

    【解决方案2】:

    基本上,您将 url 指定为 proxy_pass 指令的一部分,以下 location 指令应该这样做:

    location ~ ^/customer1/myapp(/?)(.*) {
        proxy_pass http://127.0.0.1:8001/$2;
    }
    

    nginx如何传递uri的详细解释见http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

    【讨论】:

    • 谢谢你,我没有意识到我可以使用以下表达式中的组。但是,这会将我在浏览器中的 url 重写为 http://127.0.0.1:8001/$2 我希望它保持原样。它也不适合 django-admin 登录屏幕。
    • 这适用于大多数应用程序,我接受了,但我发现最好的解决方案是使用子域 customer.myserver.com,而不是在 url 的主要部分包含客户。
    • 这个答案是错误的做法;有关问题的解释,请参阅serverfault.com/a/728792/110020
    • 我使用您的配置将my_domain/router 位置代理传递给192.168.0.1:8000,这可行,但随后浏览器网址被192.168.0.1:8000/webman/index.cgi 重写,这是登录页面,然后其余操作使用相同的基于IP 的URL .我想访问我的路由器控制台 my_domain/router/webman/index.cgi 而不是将 URL 更改为我的路由器内部 IP 地址......你能指导我如何实现它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2021-10-10
    • 2016-04-12
    • 2019-05-26
    • 2023-03-08
    • 2018-10-19
    相关资源
    最近更新 更多