区分nginx,haproxy,清漆和uWSGI/Gunicorn

wha*_*atf 27 python wsgi http nginx haproxy

我是sys管理员的新手,并且只配置了一个带有nginx(服务静态文件)和gunicorn作为Web服务器的VPS.

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

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

haproxy:高性能负载均衡器

varnish:缓存HTTP反向代理

gunicorn:python WSGI http服务器

uwsgi:另一个python WSGI服务器

我一直在阅读有关上述所有5种工具的内容,我对于哪一种用于何种目的感到困惑?有人可以用非专业人的方式向我解释一下,当一起使用时,每种工具的用途是什么,以及它们涉及哪些具体问题?

Ama*_*man 73

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

HTTP服务器

网站'Alpha'只包含一些纯HTML,CSS和Javascript.内容是静态的.

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

应用服务器

网站'Beta'是动态的,使用Django Web Framework 编写.

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

uWSGI也可以接受和处理静态内容的HTTPS请求,因此如果您想要,您可以完全由NGINX提供网站Alpha,并且完全由uWSGI提供网站Beta.就是这样.

反向代理服务器

但是uWSGI在处理静态内容方面表现不佳,所以你宁愿使用NGINX来获取静态内容,比如图像,甚至在网站上也是如此.但是,有些东西必须区分请求并将它们发送到正确的位置.那可能吗?

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

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

您还将托管网站Gamma,这是一个在国际上流行并且收到大量流量的博客.

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

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

缓存服务器

由于流量庞大,网站Gamma超出了您的VPS容量.假设你主持网站Delta,你的网络服务器无法处理Delta的原因是由于一个非常内容繁重的流行功能.

高速缓存服务器能够理解经常请求什么媒体内容并且以不同方式存储该内容,使得可以更快地服务它.这是通过减少磁盘IO操作来实现的; 流行的内容可以存储在内存或虚拟内存中.您可能决定将现有的NGINX堆栈与VarnishMemchached等技术相结合,以更有效地实现此类优化和服务器网站Gamma.


Nel*_*son 5

我将按照从您的Web浏览器发出请求时命中的顺序为每一个描述一个非常简洁(非常非正式)的描述:

  • HAProxy平衡了您的流量负载,因此如果您的网页每秒接收5000次点击,您只能使用一个网络服务器来处理,因此HAProxy将平衡您背后的网络服务器之间的点击量.

  • Varnish是一个缓存服务器,它位于您的Web服务器之前和HAProxy之后,因此如果资源已经被Varnish缓存,他将自己提供请求,而不是将请求传递给后面的Web服务器.

  • ngingx,gunicorn,uwsgi是Web服务器,这将是后面清漆和将得到的清漆将让经过的请求.这些Web服务器使用优化设计来处理高负载(每秒请求数).

  • Memcache在您的编程语言级别工作,因此如果您使用PHP,您可以在memcache中缓存mysql查询的结果,以便在您的PHP代码执行时不再重复相同的查询.但是Varnish在更高级别运行,例如缓存您在网页中引用的css文件,因此他从内存缓存中提供css文件,而不是让Web服务器从磁盘读取它们. (2认同)
  • 因此,memcache可以在您的PHP脚本,缓存变量,函数输出中运行,无论您想要什么.但是清漆在文件级别工作,他将缓存PHP页面的整个输出,就像他对其他文件资源(如css文件,javascript文件或图像文件)一样. (2认同)

cob*_*aco 5

第一个gunicorn和uwsgi都是应用程序.换句话说,他们负责以稳定和高效的方式运行您的python代码.通常作为常规Web服务器的后端.

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

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

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

所以基本上:

  1. 你的python代码存在于appserver(uwsgi或gunicorn)中
  2. 您的静态webassets位于nginx中
  3. haproxy和varnish是允许您更好地服务于大量请求的软件