【问题标题】:Differentiate nginx, haproxy, varnish and uWSGI/Gunicorn [closed]区分 nginx、haproxy、varnish 和 uWSGI/Gunicorn [关闭]
【发布时间】:2012-10-24 00:30:51
【问题描述】:

我对系统管理员的东西真的很陌生,并且只配置了一个带有 nginx(提供静态文件)和 gunicorn 作为 Web 服务器的 VPS。

我最近一直在阅读其他不同的东西。我开始了解其他工具:

nginx : 高性能 HTTP 服务器和反向代理,以及 IMAP/POP3 代理服务器

haproxy : 高性能负载均衡器

varnish:缓存 HTTP 反向代理

gunicorn : python WSGI http 服务器

uwsgi : 另一个 python WSGI 服务器

我一直在阅读上述所有 5 种工具,但我对哪一种用于什么目的感到困惑?有人可以用通俗的话向我解释一下每种工具的用途,一起使用时以及它们解决了哪些具体问题?

【问题讨论】:

  • 我不同意这个问题被标记为离题。
  • 与其将其标记为离题,不如将其移至 serverfault 并重定向?

标签: python http nginx wsgi haproxy


【解决方案1】:

假设您计划在您的新 VPS 上托管几个网站。让我们看看每个站点可能需要的工具。

HTTP 服务器

网站“Alpha”仅由一些纯 HTML、CSS 和 Javascript 组成。内容是静态的。

当有人访问网站 Alpha 时,他们的浏览器会发出一个 HTTP 请求。您已配置(通过 DNS 和名称服务器配置)该请求被定向到您的 VPS 的 IP 地址。现在您需要您的 VPS 能够接受该 HTTP 请求,决定如何处理它,并发出访问者的浏览器可以理解的响应。您需要一个 HTTP 服务器,例如 Apache httpdNGINX,假设您进行了一些研究并最终决定使用 NGINX。

应用服务器

网站“测试版”是动态的,使用 Django Web 框架编写。

WSGI is an protocol 描述 Python 应用程序(django 应用程序)和应用程序服务器之间的接口。所以你现在需要的是一个 WSGI 应用服务器,它能够理解 Web 请求,对应用程序的各种对象进行适当的“调用”,并返回结果。这里有很多选择,包括 gunicornuWSGI。假设您进行了一些研究并最终决定使用 uWSGI。

uWSGI 也可以接受和处理静态内容的 HTTPS 请求,所以如果您愿意,您可以让网站 Alpha 完全由 NGINX 提供服务,而网站 Beta 则完全由 uWSGI 提供服务。就是这样。

反向代理服务器

但是 uWSGI 在处理静态内容方面的性能很差,所以你宁愿使用 NGINX 来处理像图片这样的静态内容,即使是在网站 Beta 上也是如此。但是随后必须区分请求并将它们发送到正确的位置。这可能吗?

事实证明 NGINX 不仅仅是一个 HTTP 服务器,还是一个reverse proxy 服务器:它能够将传入的请求重定向到另一个地方,比如你的 uWSGI 应用服务器,或者许多其他地方,收集响应并将它们发送回原始请求者。惊人的!因此,您将所有传入请求配置为转到 NGINX,它将提供静态内容,或者在需要时将其重定向到应用服务器。

使用多个 Web 服务器进行负载平衡

您还托管了网站 Gamma,这是一个在国际上很受欢迎并获得大量流量的博客。

对于 Gamma,您决定设置多个 Web 服务器。所有传入的请求都将通过 NGINX 发送到您的原始 VPS,并且您将 NGINX 配置为以循环方式将请求重定向到其他几个 Web 服务器之一,并将响应返回给原始请求者。

HAProxy 是专门为高流量站点平衡负载的 Web 服务器。在这种情况下,您可以使用 NGINX 来处理站点 Gamma 的流量。在其他情况下,可以选择设置高可用性集群:例如,将所有请求发送到 HAProxy 之类的服务器,它会智能地将流量重定向到类似于您原始 VPS 的 nginx 服务器集群。

缓存服务器

由于流量庞大,网站 Gamma 超出了您的 VPS 的容量。假设您改为托管网站 Delta,而您的 Web 服务器无法处理 Delta 的原因是由于一个流行的功能非常内容繁重。

缓存服务器能够了解哪些媒体内容被频繁请求,并以不同的方式存储这些内容,以便更快地提供服务。这是通过减少磁盘 IO 操作来实现的;流行的内容可以存储在内存或虚拟内存中。您可能决定将现有 NGINX 堆栈与 VarnishMemchached 等技术结合起来,以更有效地实现此类优化和服务器网站 Gamma。

【讨论】:

  • +1 以获得更详细的答案:-)
  • 这是一个完美的答案。谢谢!
  • 请修改:“[...] uWSGI 在处理静态内容方面表现不佳 [...]”。我意识到这是挑剔的,这个例子只是说明性的,但 IMO 它应该仍然是准确的(在提出问题的时候,uWSGI 已经在 LONG 时间内提供了高性能 ReverseProxy/static-files 支持)...除此之外,uWSGI 对所触及的每个 类别都有高级支持——远远超出列出的竞争对手——例如动态订阅路由(与循环/等)...我唯一的地方不要使用它是“缓存服务器”,Varnish 更适合。除此之外,对于新手来说,这是一个很好的概述:)
  • 文本说 uSWGI,但我认为你的意思是 uWSGI。 (我不能编辑,所以不允许少量字符编辑)。
  • 谢谢,@ramn。固定。
【解决方案2】:

我将为每一个提供一个非常简洁(非常非正式)的描述,按照您从网络浏览器发出请求时它们被点击的顺序:

  • HAProxy 可以平衡您的流量负载,因此如果您的网页每秒接收 5000 次点击,那么您无法仅使用一个 网络服务器,因此 HAProxy 将平衡您的网络服务器之间的命中 落后了。

  • Varnish 是一个缓存服务器,它位于您的网络服务器前面和 HAProxy 后面,所以如果一个资源已经被 Varnish 缓存了,他将自己处理请求,而不是 将请求传递给后面的网络服务器。

  • ngingxgunicornuwsgi 是 Web 服务器,它们位于 varnish 后面,并会获取 varnish 允许的请求经过 通过。这些网络服务器使用优化的设计来处理高 加载(每秒请求数)。

【讨论】:

  • 很好,明白了,那么 memcache 在上述架构中的位置是什么? Varnish 显然也在做同样的事情,那我们为什么需要 memcache?
  • Memcache 在您的编程语言级别工作,因此如果您使用 PHP,您可以将 mysql 查询的结果缓存在 memcache 中,这样当您的 PHP 代码执行时就不会再次重复相同的查询。但是 Varnish 在更高级别上运行,例如缓存您在网页中引用的 css 文件,因此他从内存中的缓存中提供 css 文件,而不是让网络服务器从磁盘读取它们。
  • 所以,memcache 可以在您的 PHP 脚本中操作,缓存变量,函数输出,随心所欲。但是 varnish 是在文件级别工作的,他会缓存你 PHP 页面的整个输出,就像他对 css 文件、javascript 文件或图像文件等其他文件资源所做的一样。
  • 谢谢了解!我会将您的答案标记为正确,但我发现@Aman 的答案最详细且易于理解。感谢您的宝贵时间。
  • 不客气!而且很公平,阿曼的回答更详细,我也赞成:-)
【解决方案3】:

First gunicorn 和 uwsgi 都是应用服务器。换句话说,他们负责以稳定和高性能的方式运行您的 python 代码。通常作为常规网络服务器的后端。

网络服务器是 nginx,它擅长提供静态资产并将动态内容请求传递给应用服务器。

如果在 nginx 和客户端之间添加的 varnish 中,上述内容不能提供足够的性能,它应该会加快对同一事物的重复请求。

haproxy 是一个负载均衡器,如果您有多个服务器用于相同的内容,该软件将尝试在它们之间以最佳方式分配请求。

基本上就是这样:

  1. 您的 Python 代码位于应用服务器(uwsgi 或 gunicorn)中
  2. 您的静态网络资产位于 nginx 中
  3. haproxy 和 varnish 是可以让您更好地处理大量请求的软件

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 2012-05-30
    • 2014-05-25
    • 2013-02-17
    • 2017-10-04
    • 2015-02-08
    • 2011-12-06
    • 2017-11-27
    相关资源
    最近更新 更多