订购:1. nginx 2.清漆3. haproxy 4. Web服务器?


50

我见过人们建议将所有这些都组合在一起,但是它们似乎具有很多重叠的功能,因此我想深入探讨为什么您可能想要在访问实际的Web服务器之前先通过3个不同的程序。

nginx:

  • ssl:是的
  • 压缩:是
  • 快取:是
  • 后端池:是

漆:

  • ssl:否(隧道?)
  • 压缩:
  • 快取:是(主要功能)
  • 后端池:是

haproxy:

  • ssl:否(隧道)
  • 压缩:
  • 快取:否
  • 后端池:是(主要功能)

是否将所有这些链接在您的主要Web服务器之前只是为了获得其一些主要功能优势?

有许多守护进程一起流式传输以做类似的事情似乎很脆弱。

您的部署和订购偏好是什么?为什么?


1
Varnish现在具有SSL支持:请参阅blog.exceliance.fr/2012/09/10/…–
MiniQuark

4
您想说HAProxy吗?
Luis Lobo Borobia

Nginx似乎拥有所有功能,因此我想只使用nginx。
Seun Osewa 2014年

Answers:


60

简单的说..

HaProxy是市场上最好的开源负载平衡器
Varnish是市场上最好的开源静态文件缓存器。
Nginx是市场上最好的开源Web服务器。

(当然这是我和其他许多人的意见)

但通常,并非所有查询都遍历整个堆栈。

一切都通过haproxy和nginx /多个nginx进行。
唯一的不同是您将“螺栓”固定在清漆上以用于静态请求。

  • 任何请求都经过负载平衡以实现冗余和吞吐量(很好,这是可扩展的冗余)
  • 任何对静态文件的请求都首先到达清漆缓存(很好,那很快)
  • 任何动态请求都会直接发送到后端(很棒,不会使用清漆)

总体而言,此模型适合可扩展且不断发展的体系结构(如果没有多个服务器,请删除haproxy)

希望这会有所帮助:D

注意:实际上,我还将同时介绍用于SSL查询的Pound:D
您可以有一个专用于解密SSL请求的服务器,并将标准请求传递到后端堆栈:D(这使整个堆栈运行起来更快捷,更简单)


1
非常有趣,尤其是有关解密服务器的部分。+1
格里

很棒的答案。我想知道什么摆在一切面前?是HAProxy还是Nginx?
约翰

2
@John:[客户端-> HAProxy->清漆-> Nginx->静态内容]或[客户端-> HAProxy-> Nginx(可选)->应用程序服务器(动态内容)]
MiniQuark

2
为什么要缓存静态并动态投放?Nginx快速提供静态文件。我更喜欢使用像[ HAProxy-> Nginx] 这样的堆栈作为静态对象,并使用[ HAProxy-> Nginx-> Varnish-> Apache]来在动态对象上实现缓存。如您使用专用终止节点所述,在负载均衡器处终止SSL。
Steve Buzonas 2013年

33

前言

2016年更新。事情在不断发展,所有服务器都在不断完善,它们都支持SSL,并且网络比以往任何时候都更加出色。

除非另有说明,否则以下内容是针对业务和初创企业的专业人员的,为数千至数百万的用户提供支持。

这些工具和体系结构需要大量的用户/硬件/金钱。您可以在家庭实验室尝试此操作或运行博客,但这没有多大意义。

通常,请记住要保持简单。附加的每个中间件都是要维护的另一个关键中间件。没有什么可添加的,但是没有什么要删除的,则无法实现完美。

一些常见且有趣的部署

HAProxy(平衡)+ Nginx(PHP应用程序+缓存)

该网络服务器是运行php的nginx。当nginx已经存在时,它也可以处理缓存和重定向。

HAProxy ---> nginx-php
A       ---> nginx-php
P       ---> nginx-php
r       ---> nginx-php
o       ---> nginx-php
x       ---> nginx-php
y       ---> nginx-php

HAProxy(平衡)+ Varnish(缓存)+ Tomcat(Java应用程序)

HAProxy可以基于请求URI(* .jpg * .css * .js)重定向到Varnish。

HAProxy ---> tomcat
A       ---> tomcat
        ---> tomcat
P       ---> tomcat <----+
r       ---> tomcat <---+|
o                       ||
x       ---> varnish <--+|
y       ---> varnish <---+

HAProxy(平衡)+ nginx(用于主机和缓存的SSL)+ Webserver(应用程序)

即使每个人都必须说SSL(特别是此HAProxy-WebServer链接包含通过EC2的私人用户信息),Web服务器也不讲SSL 。添加本地nginx可以将SSL引入主机。一旦nginx存在,它也可能会进行一些缓存和URL重写。

注意:正在发生端口重定向443:8080,但这不是功能的一部分。进行端口重定向没有任何意义。负载平衡器可以直接与webserver:8080对话。

          (nginx + webserver on same host)
HAProxy ---> nginx:443 -> webserver:8080
A       ---> nginx:443 -> webserver:8080
P       ---> nginx:443 -> webserver:8080
r       ---> nginx:443 -> webserver:8080
o       ---> nginx:443 -> webserver:8080
x       ---> nginx:443 -> webserver:8080
y       ---> nginx:443 -> webserver:8080

中间件

HAProxy:负载平衡器

主要特点

  • 负载平衡(TCP,HTTP,HTTPS)
  • 多种算法(轮询,源ip,标头)
  • 会话持久性
  • SSL终止

类似替代品:nginx(可配置为负载平衡器的多功能Web服务器)
不同替代品:云(Amazon ELB,Google负载平衡器),硬件(F5,fortinet,citrix netscaler),其他和全球(DNS,任播,CloudFlare)

HAProxy的功能是什么?何时使用它?
每当您需要负载平衡时。HAProxy是解决方案。

除非您希望很便宜,快速又肮脏或者您没有可用的技能,否则可以使用ELB:D

除非您在银行/政府/类似机构中需要使用具有严格要求(专用基础架构,可靠的故障转移,两层防火墙,审核内容,SLA支付每分钟停机时间x%的SLA费用)的硬数据中心,然后您可以在包含30个应用程序服务器的机架顶部放置2个F5。

除非您希望超过100k HTTP [S] [和多站点],否则您必须拥有多个 HAProxy,并在它们前面具有[global]负载均衡层(cloudflare,DNS,任播)。从理论上讲,全局平衡器可以直接与Web服务器通信,从而可以放弃HAProxy。但是,通常,您应该保持HAProxy作为数据中心的公共入口点,并调整高级选项以在主机之间公平地平衡并最大程度地减少差异。

个人意见:一个小型的,包含在内的开源项目,完全致力于“一个真实的目的”。在我一生中遇到的最简单的配置(一个文件),最有用和最可靠的开源软件中。

Nginx:不烂的Apache

主要特点

  • WebServer HTTP或HTTPS
  • 在CGI / PHP /其他版本中运行应用程序
  • URL重定向/重写
  • 访问控制
  • HTTP标头操作
  • 快取
  • 反向代理

类似的选择:Apache,Lighttpd,Tomcat,Gunicorn ...

Apache是​​事实上的Web服务器,也被称为巨大的Clusterfuck,由数十个模块和数千行构成httpd.conf,位于一个损坏的请求处理体系结构之上。nginx使用更少的模块,(稍微)更简单的配置和更好的核心架构来重做所有这些。

Nginx是做什么的,您什么时候必须使用它?
Web服务器旨在运行应用程序。当您的应用程序开发为可以在nginx上运行时,您已经拥有nginx了,您也可以使用其所有功能。

除非您的应用程序不打算在nginx上运行并且在堆栈中找不到nginx(Java商店有人吗?),否则nginx毫无意义。您的当前Web服务器中可能存在Web服务器功能,而其他任务则可以通过适当的专用工具(HAProxy / Varnish / CDN)更好地处理。

除非您的网络服务器/应用程序缺少功能,难以配置和/或您宁愿干掉工作而不是看着它(Gunicorn有人吗?),否则您可以将nginx放在前面(即每个节点本地)以执行URL重写,发送301重定向,实施访问控制,提供SSL加密以及即时编辑HTTP标头。[这些是Web服务器所期望的功能]

Varnish:缓存服务器

主要特点

  • 快取
  • 高级缓存
  • 细粒度缓存
  • 快取

相似的选择:nginx(可配置为缓存服务器的多功能Web服务器)
不同的选择:CDN(Akamai,Amazon CloudFront,CloudFlare),硬件(F5,Fortinet,Citrix Netscaler)

Varnish有什么作用?何时使用它?
它确实缓存,仅缓存。通常不值得付出努力,这是浪费时间。尝试使用CDN。请注意,缓存是运行网站时您应该关心的最后一件事。

除非您仅运行有关图片或视频的网站,否则应彻底研究CDN并认真考虑缓存。

除非您被迫在自己的数据中心中使用自己的硬件(不能选择CDN)并且您的Web服务器在交付静态文件方面很糟糕(添加更多Web服务器无济于事),那么Varnish是最后的选择。

除非您的站点具有大多数是静态的,但复杂的,动态生成的内容(请参阅以下段落),否则Varnish可以节省Web服务器上的大量处理能力。

静态缓存在2016年被高估了

缓存几乎是无配置,无金钱和无时间的。只需订阅CloudFlare,CloudFront或Akamai或MaxCDN。我编写此行的时间比设置缓存所需的时间更长,而且我手里拿着的啤酒比CloudFlare订阅的中位数还要贵。

所有这些服务对于静态* .css * .js * .png以及其他内容都是开箱即用的。实际上,它们大多遵循Cache-ControlHTTP标头中的指令。缓存的第一步是配置Web服务器以发送适当的缓存指令。不管是什么CDN,什么Varnish,什么浏览器在中间。

性能考量

Varnish的创建是在一般Web服务器阻塞以在博客上提供猫图片的时候。如今,普通现代多线程异步流行语驱动的网络服务器的单个实例可以可靠地将小猫运送到整个国家。由sendfile()

我为最后一个项目做了一些快速的性能测试。一个单独的tomcat实例可以通过HTTP每秒提供21000至33000个静态文件(测试HTTP /客户端连接数从20B到12kB的文件)。持续的出站流量超过2.4 Gb / s。生产将只有1 Gb / s接口。不能做得比硬件更好,即使尝试使用Varnish也没有意义。

缓存复杂的动态内容

CDN和缓存服务器通常会忽略带有以下参数的URL ?article=1843,它们会忽略带有会话Cookie或经过身份验证的用户的任何请求,并且会忽略大多数MIME类型,包括application/jsonfrom /api/article/1843/info。有可用的配置选项,但通常不是细粒度的,而是“全部或全部”。

Varnish可以具有定制的复杂规则(请参见VCL),以定义可缓存的内容和不可缓存的内容。这些规则可以按URI,标头和当前用户会话cookie和MIME类型以及所有内容一起缓存特定内容。对于某些非常特定的负载模式,这可以节省Web服务器上的大量处理能力。那时候Varnish方便且令人敬畏。

结论

我花了一些时间来理解所有这些部分,何时使用它们以及它们如何组合在一起。希望这可以帮到你。

事实证明这很长(写了6个小时。OMG!:O)。也许我应该开一个博客或一本书。有趣的事实:答案的长度似乎没有限制。


5
答案的长度是有限制的,但是您必须再写几本书才能达到答案。
迈克尔·汉普顿

2
关于缓存,有一点值得一提:在您无法控制应用程序的情况下,它是一种提高网站性能的有效方法;特别是如果应用程序确实具有愚蠢的缓存头(企业应用程序有人吗?)。但是,您确实必须更加了解经过身份验证的资源。
卡梅隆·克尔

@ user5994461我很想读你的博客。惊人的答案!
oxalorg

20

这三个工具确实具有共同的功能。大多数设置都可以使用3中2的任意组合,这取决于它们的主要目的。如果您知道应用程序服务器在静态变量上速度很快(例如:nginx),通常会牺牲一些缓存。如果要安装数十台或数百台服务器,而不在乎充分利用它们或解决问题,通常会牺牲一些负载平衡功能。如果要运行一个到处都有许多组件的分布式应用程序,通常会牺牲一些Web服务器功能。尽管如此,仍有一些人与他们一起建造了有趣的农场。

您应该记住,您在谈论3种固体产品。通常,您不需要对它们进行负载平衡。如果需要前端SSL,则首先使用nginx作为反向代理是可以的。如果您不需要它,那么前面的清漆就可以了。然后,您可以使用haproxy来平衡应用程序的负载。有时,您还希望根据文件类型或路径,在haproxy本身上切换到其他服务器场。

有时,您必须防御严重的DDoS攻击,而前面的haproxy会比其他方法更适合。

通常,您不必担心在选择之间会做出什么妥协。您应该选择如何组装它们,以获得现在和将来满足您需求的最佳灵活性。即使您多次堆叠其中的一些,根据您的需求有时可能还是正确的。

希望这会有所帮助!


1
HAProxy的+1 —作者回答有关服务器故障的问题。谢谢。
Joel K

Arenstar:您编写了其中一种工具吗?Willy Tarreau是HAProxy的主要开发人员。
Joel K

谢谢你的威利。您在上方向Arenstar回答了我的问题。
约翰

2
请注意,HAProxy的当前开发代码现在包括SSL。
乔尔·K

14

所有其他答案均为2010年前,因此添加了更新的比较。

Nginx的

  • 完整的Web服务器,也可以使用其他功能。例如:HTTP压缩
  • SSL支持
  • 由于Nginx从一开始就设计为轻便的,因此重量非常轻。
  • Near Varnish缓存性能
  • 接近HAProxy负载平衡性能

  • 最适合复杂的缓存方案并与应用程序结合使用。
  • 最佳静态文件缓存器
  • 不支持SSL
  • 内存和CPU占用器

灭螺

  • 最佳的负载均衡器,具有前沿的负载均衡功能,可与硬件负载均衡器媲美
  • 从1.5.0开始支持SSL
  • 更简单,只是没有http实现的tcp代理,这使其速度更快且更不易出错。

因此,最好的方法似乎是以适当的顺序实施所有这些方法。

但是,对于一般用途,Nginx是最佳的,因为您可以获得所有人的均高于平均水平的性能:缓存,反向代理,负载平衡,而资源利用率却很少。然后,您将具有SSL和完整的Web服务器功能。


6

Varnish支持负载平衡:http : //www.varnish-cache.org/trac/wiki/LoadBalancing

Nginx支持负载平衡:http : //wiki.nginx.org/NginxHttpUpstreamModule

我只是用清漆+ stunnel来配置它。如果由于其他原因需要nginx,我将只使用nginx +清漆。您可以让nginx接受SSL连接并将其代理到清漆,然后通过http与nginx进行清漆对话。

有些人可能将nginx(或Apache)加入其中,因为这些工具比Varnish更通用。例如,如果您想在代理层转换内容(例如,使用XDV,apache过滤器等),则需要其中之一,因为Varnish本身无法做到这一点。有些人可能只是更熟悉这些工具的配置,因此使用Varnish作为简单的缓存并在另一层进行负载平衡会更容易,因为他们已经熟悉Apache / nginx / haproxy作为负载平衡器。


是的-“后端池”是要指出所有这三个都具有负载平衡功能。从我的初步调查看来,HAProxy具有最可调的负载平衡选项。
Joel K 2010年

这听起来很合理,因为它是作为负载平衡工具专门构建的。另一方面,Varnish的负载平衡功能非常好,从这种混合中删除一个进程可以使配置更简单,延迟更短。
larsks'Nov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.