我见过有人建议将所有这些都结合在一个流程中,但它们似乎有很多重叠的功能,所以我想深入研究一下为什么你可能想要在访问实际的 Web 服务器之前经过 3 个不同的程序。
nginx的:
- ssl:是
- 压缩:是
- 缓存:是
- 后端池:是
漆:
- ssl:否(stunnel?)
- 压缩:?
- 缓存:是(主要功能)
- 后端池:是
haproxy:
- ssl:否(隧道)
- 压缩:?
- 缓存:无
- 后端池:是(主要功能)
将所有这些链接到主 Web 服务器前面的目的是否只是为了获得它们的一些主要功能优势?
让如此多的守护进程一起做类似的事情似乎很脆弱。
您的部署和订购偏好是什么?为什么?
答案1
简单的说..
哈普罗西是市场上最好的开源负载均衡器。
漆是市场上最好的开源静态文件缓存器。
Nginx是市场上最好的开源网络服务器。
(当然这是我和其他许多人的观点)
但一般来说,并非所有查询都会经过整个堆栈。
一切都通过 haproxy 和 nginx/多个 nginx 进行。
唯一的区别是您需要使用 varnish 来处理静态请求。
- 任何请求都经过负载平衡以实现冗余和吞吐量(很好,这是可扩展的冗余)
- 任何对静态文件的请求都会首先到达 varnish 缓存(很好,速度很快)
- 任何动态请求都直接进入后端(很好,Varnish 不会被使用)
总体而言,这种模型适合可扩展且不断发展的架构(如果您没有多台服务器,则可以使用 haproxy)
希望这能有所帮助:D
笔记:我实际上也会介绍用于 SSL 查询的 Pound :D
您可以拥有一个专门用于解密 SSL 请求的服务器,并将标准请求传递到后端堆栈 :D(它使整个堆栈运行得更快、更简单)
答案2
前言
2016 年更新。事物在发展,所有服务器都变得更好,它们都支持 SSL,并且网络比以往更加令人惊叹。
除非另有说明,以下内容针对的是商业和初创企业的专业人士,支持数千到数百万的用户。
这些工具和架构需要大量的用户/硬件/资金。您可以在家庭实验室或博客上尝试,但这样做没有多大意义。
作为一般规则,请记住你想把事情简单化. 每个附加的中间件都是另一个需要维护的关键中间件。完美不是无可添加,而是无可删除。
一些常见且有趣的部署
HAProxy(平衡)+ nginx(php 应用程序 + 缓存)
Web 服务器是运行 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,但网络服务器却不使用 SSL(尤其是这个 HAProxy-WebServer 链接,其中包含通过 EC2 传输的私人用户信息)。添加本地 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
除了当您在银行/政府/类似部门工作并需要使用自己的数据中心且具有硬性要求(专用基础设施、可靠的故障转移、2 层防火墙、审计内容、SLA 支付每分钟停机 x%,全部合而为一)时,您可以将 2 个 F5 放在包含 30 台应用服务器的机架顶部。
除了当你想超过 100k HTTP(S) [和多站点] 时,那么你必须拥有倍数HAProxy 前面有一层 [全局] 负载平衡(cloudflare、DNS、anycast)。理论上,全局平衡器可以直接与允许放弃 HAProxy 的 Web 服务器通信。但是通常情况下,您应该将 HAProxy 保留为数据中心的公共入口点,并调整高级选项以在主机之间公平平衡并最大限度地减少差异。
个人想法:一个小型、封闭的开源项目,完全致力于一个真正的目的。这是我一生中遇到的最简单的配置(一个文件)、最有用和最可靠的开源软件之一。
Nginx的:不错的 Apache
主要特点:
- Web 服务器 HTTP 或 HTTPS
- 以 CGI/PHP/其他方式运行应用程序
- URL 重定向/重写
- 访问控制
- HTTP 标头操作
- 缓存
- 反向代理
类似替代品:Apache、Lighttpd、Tomcat、Gunicorn……
Apache 是事实上的 Web 服务器,也被称为一个由数十个模块和数千行代码组成的巨型集群,其httpd.conf
构建于一个支离破碎的请求处理架构之上。nginx 重做了所有这些,但它包含更少的模块、(稍微)更简单的配置和更好的核心架构。
nginx 有什么用处?什么时候必须使用它?
Web 服务器用于运行应用程序。当您的应用程序开发为在 nginx 上运行时,您已经拥有 nginx,并且您也可以使用其所有功能。
除了如果您的应用程序不打算在 nginx 上运行,而 nginx 在您的堆栈中无处可寻(有人在 Java 商店吗?),那么 nginx 就没有什么意义了。Web 服务器功能可能存在于您当前的 Web 服务器中,其他任务最好由适当的专用工具(HAProxy/Varnish/CDN)来处理。
除了当您的 Web 服务器/应用程序缺少功能、难以配置和/或您宁愿死也不愿看它(有人用 Gunicorn 吗?)时,您可以在前端(即每个节点本地)放置一个 nginx 来执行 URL 重写、发送 301 重定向、强制访问控制、提供 SSL 加密和动态编辑 HTTP 标头。[这些是 Web 服务器所期望的功能]
漆:缓存服务器
主要特点:
- 缓存
- 高级缓存
- 细粒度缓存
- 缓存
类似替代品:nginx(可配置为缓存服务器的多用途 Web 服务器)
不同的选择:CDN(Akamai、Amazon CloudFront、CloudFlare)、硬件(F5、Fortinet、Citrix Netscaler)
Varnish 有什么用处?什么时候必须使用它?
它只做缓存。通常不值得付出努力,而且浪费时间。请尝试 CDN。请注意,在运行网站时,缓存是您最不应该关心的事情。
除了当您运行专门有关图片或视频的网站时,您应该彻底研究 CDN 并认真考虑缓存。
除了当您被迫在自己的数据中心使用自己的硬件(CDN 不是一个选项)并且您的 Web 服务器在传送静态文件方面表现很糟糕(添加更多 Web 服务器也无济于事)时,Varnish 是最后选择。
除了当您的网站主要包含静态但复杂的动态生成内容(请参阅以下段落)时,Varnish 可以节省您的网络服务器上的大量处理能力。
2016 年静态缓存被高估了
缓存几乎无需配置、无需花钱、无需时间。只需订阅 CloudFlare、CloudFront、Akamai 或 MaxCDN。我写这句话所花的时间比设置缓存所花的时间还要长,而且我手里拿着的啤酒比 CloudFlare 的订阅价格还要贵。
所有这些服务都适用于静态 *.css *.js *.png 等。事实上,它们大多遵守Cache-Control
HTTP 标头中的指令。缓存的第一步是配置您的网络服务器以发送适当的缓存指令。中间有什么 CDN、有什么 Varnish、有什么浏览器都没关系。
性能注意事项
Varnish 诞生的时代,普通的网络服务器已经无法在博客上提供猫咪图片了。如今,一个普通的现代多线程异步流行语驱动的网络服务器实例就可以可靠地向整个国家提供小猫图片。sendfile()
。
我对我从事的上一个项目进行了一些快速性能测试。单个 tomcat 实例每秒可以通过 HTTP 提供 21,000 到 33,000 个静态文件(测试文件大小从 20B 到 12kB,HTTP/客户端连接数各不相同)。持续的出站流量超过 2.4 Gb/s。生产将只有 1 Gb/s 接口。硬件无法做得更好,尝试 Varnish 毫无意义。
缓存复杂变化的动态内容
CDN 和缓存服务器通常会忽略带有 等参数的 URL ?article=1843
,它们会忽略带有会话 cookie 或经过身份验证的用户的任何请求,并且它们会忽略大多数 MIME 类型,包括 from application/json
。/api/article/1843/info
有可用的配置选项,但通常不是细粒度的,而是“全有或全无”。
Varnish 可以自定义复杂规则(参见 VCL)来定义哪些内容可缓存,哪些内容不可缓存。这些规则可以按 URI、标头和当前用户会话 cookie 以及 MIME 类型和内容一起缓存特定内容。这可以为某些非常特定的负载模式节省大量 Web 服务器的处理能力。这时 Varnish 就派上用场了,而且非常棒。
结论
我花了一段时间才理解所有这些部分,何时使用它们以及它们如何组合在一起。希望这能对你有所帮助。
这篇回答确实很长(写了 6 个小时。天哪!:O)。也许我应该写一篇博客或一本书来介绍一下。有趣的是:答案的长度似乎没有限制。
答案3
确实,这 3 种工具具有一些共同的功能。大多数设置都可以使用这 3 种工具中的任意 2 种组合。这取决于它们的主要用途。如果您知道您的应用服务器在静态上速度很快(例如:nginx),那么牺牲一些缓存是很常见的。如果您要安装数十或数百台服务器,并且不关心如何充分利用它们或排除故障,那么牺牲一些负载平衡功能是很常见的。如果您打算在任何地方运行具有许多组件的分布式应用程序,那么牺牲一些 Web 服务器功能是很常见的。尽管如此,有些人还是会使用所有这些功能构建有趣的服务器场。
您应该记住,您谈论的是 3 种可靠的产品。通常您不需要对它们进行负载平衡。如果您需要前端 SSL,那么首先使用 nginx 作为反向代理就可以了。如果您不需要,那么在前端使用 varnish 就可以了。然后,您可以使用 haproxy 来平衡应用程序的负载。有时,您还希望根据文件类型或路径在 haproxy 本身上切换到不同的服务器场。
有时你需要防范严重的 DDoS 攻击,前面的 haproxy 比其他的更适合。
总的来说,您不必担心在选择之间做出什么妥协。您应该选择如何组装它们,以获得最佳灵活性,满足您现在和将来的需求。即使您多次堆叠它们,有时也可能适合您的需求。
希望这有帮助!
答案4
Varnish支持负载平衡:http://www.varnish-cache.org/trac/wiki/LoadBalancing
Nginx 支持负载平衡:http://wiki.nginx.org/NginxHttpUpstreamModule
我只需使用 varnish + stunnel 即可完成配置。如果出于其他原因我需要 nginx,我只需使用 nginx + varnish。您可以让 nginx 接受 SSL 连接并将它们代理到 varnish,然后让 varnish 通过 http 与 nginx 通信。
有些人可能会将 nginx(或 Apache)加入其中,因为它们比 Varnish 更通用。例如,如果您想在代理层转换内容(例如,使用 XDV、apache 过滤器等),您将需要其中之一,因为 Varnish 本身无法做到这一点。有些人可能只是更熟悉这些工具的配置,因此更容易将 Varnish 用作简单缓存并在另一层进行负载平衡,因为他们已经熟悉 Apache/nginx/haproxy 作为负载平衡器。