我正在构建一个 Web 应用程序,用户可以在其中管理项目中的文件。每个用户可以有多个项目,每个项目可以有多个文件。我已经使用 Docker 实现了这一点,其中每个项目都是一个 Docker 卷。当用户点击 webapp 界面中的一个按钮来修改他们项目中的文件时,web 服务器会配置并启动一个 worker(它是另一个 Docker 实例)来修改 Docker 卷中的文件。到目前为止,这一切都很好。
但是,现在我想通过 HTTP 提供这些项目文件。我想到的策略是:
- Web 服务器(如 nginx)接受来自用户的传入 HTTP 请求
- Web 服务器检查传入的请求以确定正在请求哪个项目。例如,如果 URL 是
sparkle-pony.myapp.com
,那么我们知道sparkle-pony
正在请求该项目。如果这个项目不存在,nginx 会做出404 Not Found
响应。 - Web 服务器还会检查用户是否已登录,以及该登录用户是否有权查看项目。如果不是,则 Web 服务器以
403 Forbidden
HTTP 响应进行响应。 - Web 服务器配置并启动一个新的 Docker 容器,可能是另一个 nginx 进程。此配置的一部分包括将正确的 Docker 卷安装到新容器上。我们将这个新启动的容器称为“内部”容器,将现有容器称为“外部”容器。
- 外部容器要么将此 HTTP 请求传递给内部容器,要么充当内部容器响应的代理。
- 内部容器可以访问项目的正确 Docker 卷并确保请求用户具有正确的权限,检查 URL 路径并从 Docker 卷中提供正确的项目文件。在请求得到适当处理后,内部容器关闭。
所以,说了这么多,我有三个问题:
- 这是一个合理的策略吗?它确实涉及为每个传入的 HTTP 请求启动一个新的 Docker 容器,但我认为这没关系......
- 将 HTTP 请求从一个容器传递到另一个容器的最佳方法是什么?或者外部容器是否必须代理来自内部容器的响应?
- 有人可以提供一些关于如何设置这样的项目的指示或示例吗?可能有一些我还不知道的工具或技术。
谢谢!