我正在使用nginx haproxy&apache设置HA(高可用性)集群。
我一直在阅读有关nginx和haproxy的好消息。 人们往往select一个或另一个,但我喜欢两个。 Hyproxy比Nginx简单的循环(即使使用上游公平补丁)更灵活的进行负载平衡。 但是我希望保持nginx在进入集群的时候将非httpsredirect到https。
另一方面,nginx提供静态内容的速度要快很多,并且会减less那些喜欢吃大量RAM的强大的apache的负载!
这是我计划的设置:
负载平衡器:nginx监听端口80/443和proxy_forward到同一台服务器上的8080上的haproxy,以在多个节点之间进行负载平衡。
节点:节点上的nginx监听8080上来自haproxy的请求,如果内容是静态的,则为其提供服务。 但是,如果它是一个后端脚本(在我的情况下PHP),代理转发到同一节点服务器上的apache2聆听不同的端口号。
从技术上讲,这个设置的工作,但我的顾虑是是否有请求通过几个代理将减慢请求? 大部分的请求将是PHP请求,因为后端是服务(这意味着从nginx – > haproxy – > nginx – > apache)。
思考? 干杯
从纯粹的性能angular度来看,让基准testing为您做出这些决定,而不是假设 – 使用像httperf这样的工具在进行架构变更时是非常宝贵的。
从架构哲学的angular度来看,我有点好奇,为什么你在应用服务器上同时拥有nginx和apache。 Nginx在静态内容方面大放异彩,并且高效地处理大多数后端框架/技术(Rails,通过FastFCGI的PHP等),所以我将放弃最后的Apache层。 再一次,这是来自于对你使用的技术的有限理解,所以你可能需要我不期待的(但是如果是这样的话,你可以在应用服务器上放置nginx,使用apache – 在正确configuration的情况下,静态内容并不是那么糟糕)。
目前,我在负载均衡服务器上使用nginx – > haproxy,在应用服务器上使用nginx,取得了很大的成功。 正如Willy Tarreau所说的那样,nginx和haproxy是一个非常快速的组合,所以我不担心在前端的速度,但要记住,增加额外的层会增加复杂性,以及失败。
你的设置越来越普遍。 你不必担心。 nginx和haproxy都可以非常快地处理和转发HTTP请求。 两者结合得非常好,做得非常好。 无需select。 安装他们都很开心。 这样您将非常快速地传送静态文件,并确保dynamic服务器的顺利扩展。
不要担心代理的数量。 问题通常是“我可以使用代理”吗? 有时这是不实际的。 如果你可以有一个,你可以有两个或三个。 许多复杂的体系结构涉及高达5-6级的代理,并且仍然非常好。 你应该小心一件事情:在一台机器上不要安装更多的这样的代理服务器,或者代理服务器必须在高负载下共享CPU时间,这会增加响应时间。 但是对于一台机器上的nginx和haproxy来说,这意味着每秒会有数以万计的请求,这并不是每个人都有的问题。
另外,避免将单线程代理与大规模multithreading/多进程软件(如apache,java等)混合在同一个系统上。
一旦将这些规则考虑在内,只需绘制符合您需要的架构,将名称放在盒子上,然后将其合理安装即可。
记住复杂性可能与代码/devise的缩放障碍一样多(如果不是更多的话)。 当您将越来越多的服务和configuration文件分散到更多的服务和configuration文件中时,您会创build一些难以扩展的东西,对于团队中新成员来说,有更多的学习曲线,需要更多的软件/软件包进行pipe理,更多潜在的失败点等等。为一个站点设置一个4层的代理层堆栈,只要使用apache或者nginx,基本上就是“过早优化”的系统pipe理员版本。
为什么不使用清漆 ? 通过这种方式,您可以将caching,代理和负载平衡整合到一个应用程序中,从体系结构的angular度来看,它是一个很好的select。
横向扩展是相当惊人的。 还有一个好处就是负载均衡器可以根据节点的实际健康情况做出更明智的决定。
configuration文件将允许您检查标题并决定从哪里提供静态和dynamic内容。
如果你真的预测要提供大量的静态内容,那么可能将大部分内容分stream到CDN上将是一个经济高效的解决scheme?
“从技术上讲,这个设置是可行的,但是我担心的是,通过多个代理请求是否会降低请求的速度?”
是的,但特别是如果你注意你的扩展系统的networking方面。 这必须是强大的。
一般来说,为了能够在许多机器上扩展和扩展工作,通常必须牺牲一些或所有单个机器的性能。 这是不可避免的,通常是不值得担心的事情(除了testing之外,您应该始终确保整体的性能吸风)。 优化零件不一定是优化整体的最佳方法。