linux - Nginx 负载均衡器为来自多个 WSGI 服务器的静态文件提供服务

标签 linux devops

所以我最近一直在学习更多关于 Nginx 的知识。我以前用它在同一系统上提供一个网络应用程序,但想单独扩展。我已经能够使用 2 个运行我的 Flask 应用程序的 Gunicorn 服务器设置一个 Nginx 负载平衡器。我的问题是如何将其设置为使用来自每个 Gunicorn 服务器的 Nginx 静态服务能力。

假设我有 3 个要付费的虚拟专用服务器。 1 号将 Nginx 作为负载均衡器/反向代理路由请求到 2 号和 3 号,它们是重复的 Web 应用程序。我希望这些独立于运行应用程序所需的一切,包括它们的静态目录。因此,负载均衡器/反向代理上没有静态目录,而是全部包含在 Web 应用程序目录结构中。

目前看起来是这样的:

                                  Gunicorn -> Flask
                                /
Nginx loadbalancer/reverseproxy 
                                \
                                  Gunicorn -> Flask

是否需要在每台 Gunicorn 服务器上安装 Nginx 以访问静态目录并将静态文件返回到 Nginx 负载均衡器/反向代理?所以如下:

                                  Nginx -> Gunicorn -> Flask
                                /
Nginx loadbalancer/reverseproxy 
                                \
                                  Nginx -> Gunicorn -> Flask

也许我做的全错了,上面的做法有点矫枉过正,可能不会提高性能。如果是这样的话,什么是一种好的结构,可以在一个主要入口点上进行负载平衡和缓存,并路由到 Gunicorn 并能够提供静态文件,这样 Gunicorn 就不必这样做了?

我真正想要的是能够拥有一台安装了 Web 应用程序所有内容的服务器,这样我就可以根据需要轻松添加更多内容,并将负载均衡器指向这些上游服务器。

任何建议都是有帮助的。

最佳答案

假设这将投入生产,并且就我对 gunicorn 的理解而言,你不应该使用 unicorn 本身来提供静态文件,

最终,整个系统前端的 nginx 将充当负载平衡器/rev 代​​理,您可以将该服务器配置为仅将传入请求分发到一组上游服务器,

现在,关于上游服务器,就像这样

Nginx -> Gunicorn -> Flask

它的配置将使某些请求从静态文件目录得到服务,而其他请求直接进入 gunicorn 服务器,

在一天结束时,您会将离散的上游服务器部署到池中并将它们添加到 rev 代​​理 conf,所以它看起来像这样(就像您提到的那样)

                                  Nginx -> Gunicorn -> Flask
                                /
Nginx loadbalancer/reverseproxy 
                                \
                                  Nginx -> Gunicorn -> Flask

请注意,每台服务器都可以单独部署,并具有单独为整个站点提供服务器的能力,

这个答案来自这样一个事实,即如果不通过服务器本身,您就无法真正提供来自其他后端主机的静态文件,并且由于 nginx 实际上是该任务中最好的东西之一,因此使用它是有意义的。

关于linux - Nginx 负载均衡器为来自多个 WSGI 服务器的静态文件提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45696860/

相关文章:

azure-devops - 为每个阶段设定时间限制

linux - 不包括日志文件的 Zip 文件

c - 如何在 posix_openpt() 中定义名称

linux - Gitlab 自定义 Hook 未运行

devops - 如何将变量传递到 'az pipelines variable-group variable create' 命令中

windows - Dockerfile vs从容器创建镜像

c# - 在没有 COM 的 Linux 上通过 PHP 运行 .NET DLL

linux - docker 处理 tar 文件时出错(退出状态 1): no space left on device

php - 如何使用yaml模板创建azure容器注册表?

mysql - 如果您有 UUID 字段,是否仍应使用基于 INT 的主键,并将 UUID 设置为唯一键,还是仅将 UUID 设置为主键?