29

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

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

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

haproxy:高性能负载均衡器

varnish : 缓存 HTTP 反向代理

gunicorn:python WSGI http 服务器

uwsgi : 另一个 python WSGI 服务器

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

4

3 回答 3

83

假设您计划在您的新 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 服务器。所有传入的请求都将通过 NGINX 发送到您的原始 VPS,并且您将 NGINX 配置为以循环方式将请求重定向到其他几个 Web 服务器之一,并将响应返回给原始请求者。

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

缓存服务器

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

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

于 2012-11-03T17:25:18.840 回答
6

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

  • HAProxy会平衡您的流量负载,因此如果您的网页每秒接收 5000 次点击,您无法仅使用一台网络服务器来处理,因此 HAProxy 将平衡您背后的网络服务器之间的点击。

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

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

于 2012-11-03T16:16:23.443 回答
5

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

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

如果上面没有提供足够的性能,你在 nginx 和客户端之间添加清漆,它应该加快对同一事物的重复请求。

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

所以基本上:

  1. 您的 python 代码位于应用服务器(uwsgi 或 gunicorn)中
  2. 您的静态网络资产位于 nginx 中
  3. haproxy 和 varnish 是可以让您更好地处理大量请求的软件
于 2012-11-03T16:39:48.227 回答