前言
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-Control
HTTP标头中的指令。缓存的第一步是配置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/json
from /api/article/1843/info
。有可用的配置选项,但通常不是细粒度的,而是“全部或全部”。
Varnish可以具有定制的复杂规则(请参见VCL),以定义可缓存的内容和不可缓存的内容。这些规则可以按URI,标头和当前用户会话cookie和MIME类型以及所有内容一起缓存特定内容。对于某些非常特定的负载模式,这可以节省Web服务器上的大量处理能力。那时候Varnish方便且令人敬畏。
结论
我花了一些时间来理解所有这些部分,何时使用它们以及它们如何组合在一起。希望这可以帮到你。
事实证明这很长(写了6个小时。OMG!:O)。也许我应该开一个博客或一本书。有趣的事实:答案的长度似乎没有限制。