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://backend1
和http://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 的站点框架运行多个站点