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

Joe*_*l K 53 nginx web varnish haproxy

我见过有人建议将所有这些组合在一个流程中,但它们似乎有很多重叠的功能,所以我想深入了解为什么您可能想要在访问实际 Web 服务器之前通过 3 个不同的程序。

nginx:

  • ssl:是的
  • 压缩:是
  • 缓存:是
  • 后端池:是

漆:

  • ssl:不(stunnel?)
  • 压缩:?
  • 缓存:是(主要功能)
  • 后端池:是

快乐代理:

  • ssl:没有(stunnel)
  • 压缩:?
  • 缓存:无
  • 后端池:是(主要功能)

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

让这么多守护进程一起做类似的事情似乎很脆弱。

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

Are*_*tar 62

简单的说..

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

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

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

一切都通过 haproxy 和 nginx/多个 nginx。
唯一的区别是您为静态请求“锁定”了清漆。

  • 任何请求都针对冗余和吞吐量进行负载平衡(很好,这是可扩展的冗余)
  • 对静态文件的任何请求首先会访问清漆缓存(很好,这很快)
  • 任何动态请求都直接发送到后端(很好,没有使用清漆)

总体而言,此模型适合可扩展且不断增长的架构(如果您没有多台服务器,请使用 haproxy)

希望这会有所帮助:D

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

  • @John:[客户端 -> HAProxy -> Varnish -> Nginx -> 静态内容] 或 [客户端 -> HAProxy -> Nginx(可选)-> 应用服务器(动态内容)] (2认同)
  • 为什么要缓存静态并提供动态服务?Nginx 提供静态文件的速度快如闪电。我更喜欢使用像 [`HAProxy` -> `Nginx`] 这样的堆栈来实现静态缓存,并使用 [`HAProxy` -> `Nginx` -> `Varnish` -> `Apache`] 来实现动态缓存。如您使用专用终止节点所述,在负载均衡器上终止 SSL。 (2认同)

use*_*461 36

前言

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
Run Code Online (Sandbox Code Playgroud)

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

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

HAProxy ---> tomcat
A       ---> tomcat
        ---> tomcat
P       ---> tomcat <----+
r       ---> tomcat <---+|
o                       ||
x       ---> varnish <--+|
y       ---> varnish <---+
Run Code Online (Sandbox Code Playgroud)

HAProxy(平衡)+ nginx(SSL 到主机和缓存)+ Web 服务器(应用程序)

即使每个人都必须说 SSL(尤其是这个 HAProxy-WebServer 链接,其中包含通过 EC2 的私人用户信息),网络服务器不说 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
Run Code Online (Sandbox Code Playgroud)

中间件

HAProxy:负载均衡器

主要特点

  • 负载均衡(TCP、HTTP、HTTPS)
  • 多种算法(循环、源IP、标头)
  • 会话持久性
  • SSL 终止

类似的替代方案:nginx(可配置为负载均衡器的多用途网络服务器)
不同的替代方案:云(Amazon ELB、Google 负载均衡器)、硬件(F5、fortinet、citrix netscaler)、其他和全球(DNS、任播、CloudFlare)

HAProxy 有什么作用,你什么时候必须使用它?
每当您需要负载平衡时。HAProxy 是首选解决方案。

除非您想要非常便宜或快速且肮脏或您没有可用的技能,否则您可以使用 ELB :D

除非您在银行/政府/类似部门需要使用自己的数据中心并有硬性要求(专用基础设施、可靠的故障转移、2 层防火墙、审计内容、SLA 以每分钟停机时间支付 x% 的费用,所有这些都合而为一)您可以将 2 个 F5 放在包含 30 个应用程序服务器的机架顶部。

除非你想超过 100k HTTP(S) [和多站点],那么你必须有多个HAProxy,它们前面有一个 [全局] 负载平衡层(cloudflare、DNS、任播)。理论上,全局平衡器可以直接与允许放弃 HAProxy 的网络服务器对话。然而,通常情况下,您应该将 HAProxy(s) 作为公共入口点 (s) 到您的数据中心并调整高级选项以在主机之间公平地平衡并最小化差异。

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

Nginx:不烂的 Apache

主要特点

  • 网络服务器 HTTP 或 HTTPS
  • 在 CGI/PHP/其他中运行应用程序
  • URL重定向/重写
  • 访问控制
  • HTTP 标头操作
  • 缓存
  • 反向代理

类似的替代品:Apache、Lighttpd、Tomcat、Gunicorn...

Apache 是事实上的 Web 服务器,也被称为httpd.conf在损坏的请求处理架构之上的数十个模块和数千行的巨型集群。nginx 重做所有这些,使用更少的模块,(稍微)更简单的配置和更好的核心架构。

nginx 有什么作用,什么时候必须使用它?
网络服务器旨在运行应用程序。当你的应用程序被开发为在 nginx 上运行时,你已经有了 nginx,你也可以使用它的所有功能。

除非您的应用程序不打算在 nginx 上运行并且在您的堆栈中找不到 nginx(Java 商店有人吗?),否则 nginx 没有什么意义。网络服务器功能可能存在于您当前的网络服务器中,其他任务由适当的专用工具(HAProxy/Varnish/CDN)处理得更好。

除非您的网络服务器/应用程序缺乏功能、难以配置和/或您宁愿死也不愿看它(Gunicorn 任何人?),那么您可以在前面(即每个节点本地)放置一个 nginx 来执行 URL重写、发送 301 重定向、实施访问控制、提供 SSL 加密以及即时编辑 HTTP 标头。[这些是网络服务器所期望的功能]

清漆:缓存服务器

主要特点

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

类似的替代方案:nginx(可配置为缓存服务器的多用途网络服务器)
不同的替代方案:CDN(Akamai、Amazon CloudFront、CloudFlare)、硬件(F5、Fortinet、Citrix Netscaler)

清漆有什么作用,什么时候必须使用它?
它做缓存,只做缓存。这通常不值得付出努力,而且是浪费时间。试试 CDN。请注意,缓存是您在运行网站时应该关心的最后一件事。

除非你运行一个专门关于图片或视频的网站,否则你应该彻底研究 CDN 并认真考虑缓存。

除非您被迫在自己的数据中心使用自己的硬件(CDN 不是一种选择)并且您的网络服务器在提供静态文件方面很糟糕(添加更多网络服务器无济于事),否则 Varnish 是最后的手段。

除非您的网站包含大部分静态但复杂的动态生成内容(请参阅以下段落),否则 Varnish 可以为您的网络服务器节省大量处理能力。

静态缓存在 2016 年被高估了

缓存几乎无需配置、无需资金且无需时间。只需订阅 CloudFlare、CloudFront、Akamai 或 MaxCDN。我写这行代码所花的时间比设置缓存所需的时间更长,而且我手里拿着的啤酒比中位数的 CloudFlare 订阅更贵。

所有这些服务都可以为静态 *.css *.js *.png 等提供开箱即用的服务。事实上,它们大多遵循Cache-ControlHTTP 标头中的指令。缓存的第一步是配置您的网络服务器以发送正确的缓存指令。什么CDN,什么Varnish,中间是什么浏览器都无所谓。

性能注意事项

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

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

缓存复杂变化的动态内容

CDN和缓存服务器通常忽略URL与参数喜欢?article=1843,却忽略了与会话cookie或身份验证的用户的任何要求,他们忽略了最MIME类型,包括application/json/api/article/1843/info。有可用的配置选项,但通常不是细粒度的,而是“全有或全无”。

Varnish 可以有自定义的复杂规则(参见 VCL)来定义什么是可缓存的,什么不是。这些规则可以通过 URI、标头和当前用户会话 cookie 以及 MIME 类型和内容缓存特定内容。对于某些非常特定的负载模式,这可以节省网络服务器上的大量处理能力。这就是 Varnish 方便且很棒的时候。

结论

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

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

  • 答案的长度是有限制的,但你必须多写几本书才能达到它。 (5认同)
  • 关于缓存有一点值得一提:当您无法控制应用程序时,它是一种提高站点性能的有效方法;特别是如果应用程序具有非常愚蠢的缓存标头(企业应用程序任何人?)。不过,您确实必须更加了解经过身份验证的资源。 (2认同)

Wil*_*eau 20

这 3 个工具确实具有共同的功能。大多数设置适用于 3 种中 2 种的任意组合。这取决于它们的主要目的是什么。如果您知道您的应用程序服务器在静态方面很快(例如:nginx),通常会接受牺牲一些缓存。如果您要安装数十或数百台服务器并且不关心充分利用它们,也不关心故障排除问题,那么通常会牺牲一些负载平衡功能。如果您打算运行带有许多组件的分布式应用程序,通常会牺牲一些 Web 服务器功能。尽管如此,有些人还是用他们所有人建造了有趣的农场。

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

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

一般来说,您不必担心在您的选择之间做出何种妥协。您应该选择如何组装它们,以获得满足您现在和未来需求的最佳灵活性。即使您多次堆叠其中的几个,有时也可能是正确的,具体取决于您的需要。

希望这会有所帮助!

  • 请注意,HAProxy 的当前开发代码现在包括 SSL。 (2认同)

beg*_*ner 14

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

nginx

  • 一个完整的网络服务器,也可以使用其他功能。例如:HTTP 压缩
  • SSL 支持
  • 非常轻,因为 Nginx 从一开始就设计得很轻。
  • 接近清漆缓存性能
  • 接近HAProxy的负载均衡性能

  • 最适合复杂的缓存场景并与应用程序结合。
  • 最好的静态文件缓存器
  • 不支持 SSL
  • 内存和 CPU 吞噬者

代理

  • 最好的负载均衡器,用于尖端的负载均衡功能,可与硬件负载均衡器相媲美
  • 自 1.5.0 起支持 SSL
  • 更简单,只是一个没有 http 实现的 tcp 代理,这使得它更快,更不容易出错。

所以最好的方法似乎是以适当的顺序实现所有这些。

然而,对于一般用途,Nginx 是最好的,因为您获得了高于平均水平的性能:缓存、反向代理、负载平衡,资源利用的开销很小。然后您就拥有 SSL 和完整的 Web 服务器功能。


lar*_*sks 6

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

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

我会简单地用清漆 + stunnel 配置它。如果我因为其他原因需要 nginx,我只会使用 nginx + varnish。您可以让 nginx 接受 SSL 连接并将它们代理到 varnish,然后让 varnish 通过 http 与 nginx 通信。

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