![多个 nginx 实例,以使 Django 项目保持独立](https://linux22.com/image/593729/%E5%A4%9A%E4%B8%AA%20nginx%20%E5%AE%9E%E4%BE%8B%EF%BC%8C%E4%BB%A5%E4%BD%BF%20Django%20%E9%A1%B9%E7%9B%AE%E4%BF%9D%E6%8C%81%E7%8B%AC%E7%AB%8B.png)
我正在 Debian 6 上使用 Django + PostrgreSQL + Nginx 构建一个应用程序。该应用程序有两个独立的组件,以后将安装在不同的机器上。
组件 A 使用 REST API 调用组件 B 中的一个函数。它存储了敏感数据,这些数据应由组件 A 只读,但由组件 B 可写。
组件 B 将数据敏感数据写入组件 A,并通过其 API 接收数据
我希望将这些组件分开,这样组件 B 的暴露不会导致组件 A 中的敏感数据暴露。为了做到这一点,我考虑在不同的 Linux 用户下运行 2 个 nginx 实例。这样,运行组件 B 的用户就看不到settings.py
组件 A 了,这会暴露 A 数据库的登录凭据和存储数据的加密密钥。
我的问题是,如何设置 nginx 来运行 2 个实例,每个实例都有自己的用户帐户?如果可能的话,我只想使用标准 Debian 存储库中提供的软件包,以免失去自动升级。
答案1
在我看来,您实际上并不需要 2 个 nginx 实例来获得您想要的分离。
您有 3 个代理在交互:nginx、app1 和 app2。在这种情况下,nginx 实际上并不直接处理数据,它只是将传入的 http 请求路由到 app1 或 app2,因此它实际上没有任何数据可泄露。
在我看来,您真正想要的是让 2 个 django 应用程序以不同的用户身份运行,并设置权限,以便 app1 无法获取应用程序 2 的数据(通过 rest-api 除外)。
您无需指定 nginx 如何与应用程序通信,但所有常用机制(fastcgi、反向代理、scgi 等)都可以很容易地为每个应用程序设置一个单独的进程。
在 nginx 端,您只需拥有 2 个服务器块(每个服务器块都有自己的子域/域名)即可实现干净的分离。
为了更加放心,你可以添加一些http://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers指令到组件 B nginx 配置,以确保它只接受指定 REST-api url 的外部/组件 A 引用
答案2
我发现一个好的方向是使用快进快退并按如下方式启动 Comp B:
sudo -u youruser manage.py runfcgi