区分nginx、haproxy、varnish和uWSGI/Gunicorn

30

我对系统管理员的工作非常陌生,只使用过nginx(用于提供静态文件)和gunicorn(用于作为web服务器)来配置VPS。

最近我了解到其他一些工具:

nginx:高性能的HTTP服务器和反向代理服务器,同时也是IMAP/POP3代理服务器

haproxy:高性能的负载均衡器

varnish:缓存HTTP反向代理服务器

gunicorn:Python WSGI HTTP服务器

uwsgi:另一种Python WSGI服务器

我已经阅读了上述5个工具的相关内容,但它们各自的作用以及它们在一起使用时解决的特定问题使我感到困惑。请有人能否用通俗易懂的语言解释每个工具的作用、它们在一起使用时的用途以及它们所涉及的特定问题?


9
我不同意将这个问题标记为“离题”。 - ramn
不要将其标记为离题,而是将其移动到ServerFault并进行重定向,可以吗? - mmlac
3个回答

84

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

HTTP服务器

网站“Alpha”只包含一些纯HTML、CSS和Javascript。内容是静态的。

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

应用服务器

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

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

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

反向代理服务器

但是uWSGI在处理静态内容方面性能较差,因此你更愿意将像图片这样的静态内容交给NGINX处理,即使是在Beta网站上也是如此。但接着就需要有某种方式来区分请求并将其发送到正确的位置。这是可能的吗?

原来NGINX不仅是HTTP服务器,还是反向代理服务器:它能够将传入的请求重定向到另一个位置,例如您的uWSGI应用程序服务器或其他位置,并收集响应并将其发送回原始请求者。太棒了!因此,您可以配置所有传入的请求都经由NGINX处理,它将提供静态内容或在需要时将其重定向到应用程序服务器。

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

您还托管着国际上广受欢迎且接收大量流量的博客网站Gamma。

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

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

缓存服务器

由于流量过大,网站Gamma超出了您的VPS容量。假设您改为托管Delta网站,并且您的Web服务器无法处理Delta是因为某个受欢迎的功能非常内容繁重。

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


+1 对于更详细的回答 :-) - Nelson
这是一个完美的答案。谢谢! - Animesh
请修改以下内容:"[...] uWSGI 在处理静态内容方面的性能较差[...]"。我意识到这有点挑剔,而且示例仅用于说明,但在我看来它仍应该准确(在提问时,uWSGI已经拥有了高性能的ReverseProxy / static-files支持很长时间)......此外,uWSGI对于每个涉及的类别都有先进的支持 - 远远超过了列出的竞争对手 - 例如动态订阅路由(与轮询/等等相比)......我唯一不使用它的地方是“缓存服务器”,在那里Varnish更适合。除此之外,对于新手来说,这是一个不错的概述 :) - anthonyrisinger
文本中写的是uSWGI,但我想你指的是uWSGI。(我无法编辑,SO不允许少量字符的编辑)。 - ramn

6

我将为每个技术给出非正式的简明描述,按照从浏览器发起请求时它们被调用的顺序:

  • HAProxy 负载均衡,如果您的网页每秒接收 5000 次点击,单个 web 服务器无法处理,因此 HAProxy 将在后面的多个 web 服务器之间平衡点击量。

  • Varnish 是一个缓存服务器,位于您的 web 服务器前面和 HAProxy 后面。如果 Varnish 已经缓存了某些资源,他会直接向用户返回请求的结果而不是将请求传递到后面的 web 服务器。

  • ngingxgunicornuwsgi 都是 web 服务器,在 Varnish 后面,只接收 Varnish 允许通过的请求。这些 web 服务器采用了优化设计,以处理高负载(每秒请求数)。


明白了,那么 memcache 在上述架构中的作用是什么?显然 Varnish 也在做同样的事情,那我们为什么还需要 memcache 呢? - whatf
2
Memcache 在编程语言层面上起作用,因此如果您使用 PHP,则可以将 mysql 查询结果缓存到 memcache 中,以便在执行 PHP 代码时不会重复相同的查询。但是 Varnish 操作的更高级别,例如缓存您在网页中引用的 css 文件,因此它从其内存缓存中提供 css 文件,而不是让 Web 服务器从磁盘读取它们。 - Nelson
2
所以,memcache可以在您的PHP脚本内部运行,缓存变量、函数输出,无论您想要在哪里。但是Varnish在文件级别上工作,他将缓存您的PHP页面的整个输出,就像他对其他文件资源(如css文件、javascript文件或图像文件)所做的一样。 - Nelson
谢谢理解!我本来会将你的答案标记为正确,但我发现@Aman的回答更加详细易懂。感谢你的时间。 - whatf
不客气!阿曼的回答更详细,我也点了赞 :-) - Nelson

5

首先,gunicorn和uwsgi都是应用服务器。换句话说,它们负责以稳定和高效的方式运行您的Python代码,通常作为常规Web服务器的后端。

Web服务器是nginx,它擅长提供静态资源并将请求传递给应用服务器处理动态内容。

如果上述方法不能提供足够的性能,则可以在nginx和客户端之间添加varnish,它应该加速重复请求相同内容的速度。

haproxy是负载均衡器,如果您有多个服务器用于相同的内容,则此软件将尝试最优地分配请求。

因此,基本上:

  1. 您的Python代码存储在应用服务器(uwsgi或gunicorn)中
  2. 您的静态Web资产存储在nginx中
  3. haproxy和varnish是允许您更好地处理大量请求的软件

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接