快速链接最新消息描述 主要特性 支持的平台 性能 可靠性 安全性 文档 GitHub 上的项目 下载 在线演示 他们在用! 企业版功能 第三方扩展 商业支持 附加功能 其他解决方案 联系方式 外部链接 讨论 Slack 频道 邮件列表 10GbE 负载均衡 (已更新) 贡献 编码风格 待解决问题 已知缺陷 ![]() 感谢您的支持! |
新闻2025年12月3日:HAProxy Technologies 的性能软件包
2025年11月26日:HAProxy 3.3.0 发布
2025年6月24日:HAProxy 3.2.0 发布
2025年2月26日:HAProxyConf 2025 早鸟票注册
2024年11月26日:HAProxy 3.1.0 发布
2024年9月18日:HAProxyConf 2025 征稿
2024年5月29日:HAProxy 3.0.0 发布
2023年12月5日:HAProxy 2.9.0 发布
2023年5月31日:HAProxy 2.8.0 发布
2023年2月14日:CVE-2023-25725 已修复!
2022年12月1日:HAProxy 2.7.0 发布
2022年6月16日:HAProxyConf:征稿
2022年5月31日:HAProxy 2.6.0 发布
2022年3月26日:QUIC 实验
从技术角度来看,其实现方式是让一个单独的 haproxy 进程在 UDP 端口 1443 上监听 QUIC,并将 HTTP 请求转发到现有进程。主进程会不断检查 QUIC 进程,当它被视为可操作时,会附加一个 Alt-Svc 头部,向客户端指示在端口 1443 上有一个 HTTP/3 实现可用,并且此宣告在短时间内有效(我们将它设置为仅一分钟,以便问题可以迅速解决,但目前只有 10 秒,以便快速测试不会造成损害) http-response add-header alt-svc 'h3=":1443"; ma=60' if { var(txn.host) -m end haproxy.org } { nbsrv(quic) gt 0 }
因此,兼容的浏览器可以自由选择是否尝试连接。其他工具(例如 git clone)将不会使用它。对于那些急于测试的人,QUIC 进程的状态报告在此处的统计页面底部:http://stats.haproxy.org/。顶部的 frontend 中的 "quic" 套接字报告了从 QUIC 进程接收的总流量,因此,如果您在重新加载页面时看到它增加,很可能您正在使用 QUIC 来读取它。在 Firefox 中,我加载了这个小插件:https://addons.mozilla.org/en-US/firefox/addon/http2-indicator/。它会在 URL 栏上显示一个小的闪光灯,根据加载页面所使用的协议(H1/SPDY/H2/H3)显示不同的颜色。当它工作时是绿色的(H3),否则是蓝色的(H2)。对于 Chrome,有 HTTP Indicator,它做同样的事情,但在使用 H3 时显示一个橙色符号。Chrome 只接受在 443 端口上的 H3(我们也为此启用了)。请注意,H2 和 H3 仅在网站以 HTTPS 浏览时提供服务:https://haproxy.cn/。 此时我仍然会说“不要在家里重现这些实验”。Amaury 和 Fred 仍在非常密切地观察进程的跟踪信息,以发现错误并在检测到问题时立即停止它。但对于非开发人员操作来说还为时过早。希望到 2.6 版本时,我们能达到爱好者们可以有足够信心并在少量监控的情况下,在不太敏感的网站上部署一些实例的程度。 2021年11月23日:HAProxy 2.5.0 发布
2021年11月5日:来自 Zerodha 的酷炫硬件捐赠
2021年11月3日:HAProxyConf 2021 将在不到两周内举行!
2021年5月14日:HAProxy 2.4.0 发布
2019年11月25日:HAProxy 2.1.0 发布!
2019年9月9日:HAProxyConf
2019年6月21日:征稿截止日期略有延长
2019年6月16日:HAProxy 2.0.0 发布!
2019年5月22日:HAProxyConf 2019 - 征稿
我们正在为我们的社区设计这次会议。所有会议都将具有高度信息性和技术性,没有营销噱头。会议将重点关注最终用户的演讲,他们将分享他们的用例和现实世界的建议。我们也期望这次会议能成为一个有趣的时刻,并成为与来自欧洲及其他地区的数百名同行交流的绝佳机会。 我们非常希望我们的社区成员在会议中扮演重要角色。考虑到这一点,请考虑作为我们征稿过程的一部分提交摘要,该过程现已开放。您可以通过访问会议网站提交您的摘要。请注意,任何明显是供应商或产品推销的提交将不会被内容选择委员会考虑。摘要必须在 2019 年 6 月 21 日前提交。所有被选中的演讲者将获得免费的全程会议通行证。 如果您对会议或征稿流程有任何疑问,请通过 submission@haproxy.com 联系我们。
2016年12月25日:1.6.11 和 1.5.19
代码和更改日志可照常在此处获取 1.6 版本和此处获取 1.5 版本。 2016年12月13日:1.7.1
代码和更改日志可照常在此处获取。 2016年11月25日:HAProxy 1.7.0 现已发布!
代码和更改日志可在此处获取。 2016年11月20日:1.6.10
代码和更改日志可照常在此处获取。 2016年11月10日:1.7-dev6
代码和更改日志可照常在此处获取。 2016年8月14日:1.6.8 和 1.7-dev4
在修复的问题中,我们可以列举 zlib 用户偶尔遇到的段错误(显然是由于对 API 的误解造成的),使用带有不同表的 sc_trackers 时的段错误,在服务器行上使用“sni”时可能发生的内存损坏,Lua 的 txn_done() 被 actions 和 fetchers 调用时的一些崩溃,在尝试将数据传递给正在经历连接重试的文件描述符后冻结某些随机文件描述符的风险,这解释了一些观察到的僵尸连接,一些 peer 协议编码问题解释了一些异常值和同步丢失,一个在处理过程中不正确的样本复制问题,这可能导致某些 fetchers 无法作为 stick table 键工作,我想这次就这么多了。代码和更改日志可照常在此处获取。 对于 1.7-dev4,我们有一些新东西。一个可能影响某些用户的更改是,我们移除了一个魔法,即如果监听器中有任何“bind”指令,则将服务器的检查端口分配给第一个“bind”指令的第一个端口。这完全没有意义,没有文档记录,在许多情况下(例如:unix sockets)不起作用,并且使得改进配置变得不可能。通常自 1.6 以来没有人再使用这个功能,因为不再允许在“listen”行上指定端口。 开发者可能会注意到,现在当他们修改一个“.h”文件时,所有东西都会被重新构建。就像我一样,在你的 make 命令行后面追加“DEP=”就行了,它会继续像以前一样工作。非开发者用户可以避免简单的错误,我们也不会被依赖地狱所困扰。 合并了一些针对 OpenBSD 的构建修复。事实上,自 1.6 以来由于各种缺失的 include(或 include 顺序)它已经无法构建了。现在好了。我很惊讶一年内我们没有收到任何抱怨,过去人们会报告 OpenBSD 的构建中断。也许这些用户现在都在使用 FreeBSD,它似乎工作得很好。 还有其他更新,如“set-src-port”、“set-dst”、“set-dst-port”操作,用于强制将传入的源/目的地址/端口替换为参数中的地址/端口(对于日志记录以及强制连接到配置为 0.0.0.0 的服务器很有用)。另一个新操作是 http-response 的“track-sc”。这对于计算某些响应事件很有用。“show tls-keys”CLI 命令现在可以显示当前的密钥。有一些过滤器更改。SNI 过滤器现在支持多证书(rsa/ecdsa)。我们现在也可以解码 Netscaler 的 CIP 协议,这是 haproxy 的 PROXY 协议的替代方案。我们现在有了一些新的样本获取函数,可以在 Linux、FreeBSD 和 NetBSD 上报告各种 TCP 级别的信息,如 RTT、重传次数等。这可以使日志在故障排除期间更有用。最后,命令行“-f”参数现在除了文件名外还支持目录。文件按字母顺序加载。这对某些用户来说很方便,但要小心排序,风险自负! 代码和更改日志可照常在此处获取。 2016年4月13日:1.5.17
2016年3月14日:1.7-dev2, 1.6.4, 1.5.16, 1.4.27, 1.3.28 (EOL)
自上次发布以来,修复了许多重要的错误。其中一些影响 1.6,当使用 http-reuse 时(孤立连接)。还修复了一些 Lua 的错误,其中一个导致段错误,另一个导致死连接。样本获取函数被保护,以防止在 tcp 连接规则中滥用第 7 层导致段错误。并且会话变量也可能在连接规则中被不当使用,产生相同的效果。对于不太重要的修复,systemd 包装器中的一些竞争条件得到了解决,这可能导致一些人遇到的孤立进程。在 1.5 中,服务器端的空闲 keep-alive 超时处理存在两个问题,有时导致短暂的忙轮询循环,有时导致新的传入请求在持久连接上被中止(浏览器必须重新发送)。 在 1.7-dev 中,我们有了过滤器,它引入了一些钩子,以便以比分析器更灵活的方式插入代码。压缩代码已经调整为使用它们。未来可能会有更多,可能是流量整形。统计数据得到了改进:现在 HTML 中可用的所有内容在 CSV 输出中也可用,并且有一个新的“typed”输出格式,对聚合器更友好。现在可以在配置文件中操作环境变量,这将解决人们在迁移到 systemd 时面临的问题,因为它不允许重新加载的进程看到环境变量的变化。 由于所有版本都已经很久没有更新了,鼓励用户升级。代码和更改日志可照常在此处获取。 2015年11月1日:1.5.15
2015年10月20日:1.6.1
2015年10月13日:HAProxy 1.6.0 现已发布!
1.7.0 的下一个发布日期定于 2016 年 9 月底,大约一年后。这一次,为了满足更多的贡献者,我们将有一个三阶段的开发周期。第一阶段将于 2016 年 3 月结束,将合并最敏感的更改,可能会导致很多破坏。这仅适用于开发人员。第二阶段将于 6 月结束,将致力于修复破坏,并仍然允许进行小的改进,只要它们不预期会导致回归。这可能是我们决定是否恢复一些早期破坏的地方,如果某些功能太破碎了。爱好者可以在此阶段开始测试并报告问题。最后阶段将于 9 月结束,将致力于最终的完善、可移植性问题和文档更新,并且对于大多数早期采用者来说应该是可以接受的。所以现在让我们回到白板前吧。 2015年9月28日:1.6-dev6
2015年8月30日:1.6-dev4
2015年7月3日 : 1.5.14:修复了一个信息泄露漏洞(CVE-2015-3281)
2015年6月26日:1.5.13
2015年6月17日:1.6-dev2
2015年5月15日:HTTP/2 发布!
2015年5月2日:1.5.12
2015年4月1日:愚人节:用 Lua 完全重写 HAProxy
与此同时,我发现自己正在变老,我去年 40 岁了,很明显我已经不像以前那样有能力优化代码了。我是老派的,还在计算一个函数执行需要多少 CPU 周期,附加一个 X-Forwarded-For 头部或解析一个 cookie 需要多少纳秒。而所有这些在人们在虚拟机中运行软件时都完全浪费了,这些虚拟机只分配 CPU 的一部分(即它们以高频率在多个虚拟机之间切换),或者将其安装在每秒饱和于 100 个请求的应用程序前面。 最近增加了 Lua,我们发现它相当快。也许没有 C 那么快,但 Lua 在进步,而 C 的技能在减少,所以我猜几年后用 Lua 写的代码会比我们能用 C 写的代码快得多。因此,我觉得宣布用 Lua 完全重写 HAProxy 是明智的。这带来了很多好处。 首先,Lua 易于学习,我们将获得更多的开发者和贡献者。原因之一是您不再需要关心资源分配。当您可以简单地做“a = b”而无需关心背后使用的内存时,做 strdup() 来保留字符串副本有什么好处呢?如今的机器很庞大,比我 10 年前使用的旧 Athlon XP 大得多。 其次,Lua 不需要编译器,所以我们每天可以为每 200 次构建节省 30 分钟,这将肯定会为每个开发者加速开发。而且我们不会依赖于特定的 C 编译器,不会受其错误的困扰,更重要的是我们将能够摆脱我们目前在一些性能关键部分中拥有的几行汇编代码。 第三,最新版本的 HAProxy 增加了许多新的样本获取函数和转换器。这不再需要了,因为代码和配置将混合在一起,就像每个人都用 Shell 脚本做的那样。这意味着任何配置都将看起来像是 haproxy 代码的 include 指令,后面跟着一些声明配置的代码。这样就可以创建无限组合的新函数,并且配置将可以访问 HAProxy 内部的任何东西。 最终,目前的 HAProxy 只会剩下 Lua 引擎,并且到那时我们可能会找到更好的引擎,这样 haproxy 将作为一个 Lua 库分发,可以在任何地方使用,甚至可能在物联网设备上,如果这有意义的话(有人曾梦想过在他们的手表里拥有 haproxy 吗?)。 这一步将使我们不必再继续进行任何代码版本控制,因为每个人都将有自己的分支,代码将以这种方式更快地增长。这也意味着 Git 对我们来说将变得无用。在安全性方面,它会好得多,因为不再可能利用所有版本共有的漏洞,因为每个版本都将是不同的。 HAProxy Technologies 将为此任务分配大量资源。显然,整个开发团队将全职从事这项工作,但我们也意识到,在此次公开宣布后,客户将不再对 C 版本感兴趣,因此我们将培训销售人员也编写 Lua,以加快开发速度。 我们将继续提供一个从 HAPEE 分支出来的企业版,并将其重命名为“Luapee”。它仍将提供所有使其成为专业解决方案的额外功能,如 VRRP、SNMP 等,并且从长远来看,我们期望也将所有这些组件用 Lua 重写。 ALOHA 设备将会有一些变化,它们主要会是一个运行所有代码的 Lua 引擎,所以我们可能会将它们重命名为 HALUA。鉴于该设备的目标一直是利用硬件和内核来进一步提升能力,我们将可以自由地将其他性能关键部分移植到 Lua 中,甚至可能包括目前也在用 C 语言编写的老化 Linux 内核。 一旦一切都移植完成,我打算利用我在微体系结构领域的旧技能来设计一个原生的 Lua 处理器,它将在我们的设备中运行,这样所有的代码都将在硅片上运行,最终比我们目前用 C 语言实现的速度快得多。 我很清楚有些部分会很乏味。用 Lua 重写 OpenSSL 既不容易也不有趣。但这是获得快速且可负担的安全所必须付出的代价。 由于工作量巨大,我们将把 1.6 的发布推迟到 2016 年 4 月 1 日,这给了我们正好 366 天来完成这项任务。我希望每个人都明白我们别无选择。 2015年2月1日:1.5.11, 1.4.26, 1.3.27, 1.3.15.14
2015年1月1日:变化中的网络之年
这会带来什么改变?一开始可能不多,但很快就会很多。网站运营商需要一些时间才能弄清楚 HTTP/2 带来的性能优势,但媒体会很快吹捧其优点,变化可能会迅速发生,即使只是为了赶上竞争的早期采用者。目前许多网站出于同样的原因已经支持 SPDY,但 SPDY 在不断发展,需要用户更多关注并经常更新。作为一个新标准,HTTP/2 将不需要那种程度的关注,它将被视为 HTTP/1.1 的直接后继者,这就是为什么它会比 SPDY 得到更广泛的采用。 所有主流浏览器都已支持 HTTP/2,其中两个(Firefox 和 Chrome)将只为 HTTPS 支持它。Internet Explorer 在 HTTP/2 被采纳后将放弃对 SPDY 的支持。这逻辑上意味着许多网站将决定启用 HTTPS,以便为上述两个浏览器的用户支持 HTTP/2。HTTPS 在连接开始时会带来额外的往返,但 HTTP/2 在传输过程中节省了很多往返,所以最终如果至少有几十个对象要检索,它仍然是一个改进。 但这将导致一个新的问题:迁移到 HTTPS 将意味着大学、企业、所有移动电话运营商和许多 ISP 运营的缓存将不再被使用。这将立即产生两个影响:第一个是互联网上的流量将增加。危言耸听者曾经说过,40 Tbps 的跨大西洋总容量几乎饱和且难以升级,我们将看看这是否属实。第二个影响是源服务器将获得显著的流量增长,这对 ADC 供应商以及 CDN 都是好事,因为它们将获得许多新客户并增加收入。可悲的是,在一些连接不良的国家,客户端缓存对互联网的生存至关重要,CDN 将无法提供帮助,情况将变得更糟。许多移动电话运营商的情况也是如此,他们今天可以观察到很高的缓存命中率。 为了解决这些情况,很可能会发生的是,ISP 和移动电话运营商将开始向其客户提供更快的互联网接入,以换取一个他们可以愉快地安装在浏览器中的根证书,以便运营商可以动态解密 SSL 流量并再次进行缓存。最终用户已经准备好接受这一点,因为当涉及到他们用智能手机做的任何事情时,他们根本不在乎自己的隐私,否则他们会总是关闭应用程序并输入密码来访问他们的电子邮件。而下一个逻辑步骤是,这些运营商销售的手机将预先安装根证书,以省去最终用户复杂的操作。 这将导致一个有趣的情况。首先,SSL 卸载解决方案供应商将乐于看到他们的销售额增加。但另一方面,SSL/TLS 模型的信任链将彻底断裂,因为最终用户将无法知道他的数据是否安全。这个链条已经非常脆弱,并且经常被滥用,但现在当流氓 CA 成为访问网络的强制要求时,不再信任 SSL 可能会成为常态。 幸运的是,一些解决方案正在开发中。在 HTTP 工作组中,它们被称为“可信代理”或“GET https://”,作为对通过显式代理发出的 HTTPS 请求可能样子的参考。它们包括让最终用户选择可以解密和不能解密的内容。这允许代理运营商让一些受信任的站点通过,并对所有其他站点进行解密/检查/缓存。这就是我们如何可以为每个人获得更好的互联网,同时拥有更好的缓存和更好的隐私。不确定这是否会在 2015 年实现,但我们应该尽一切努力让它发生! 2014年12月31日:1.5.10:年度最后一次发布!
2014年11月25日:1.5.9
2014年10月31日:1.5.8
2014年10月30日:1.5.7
2014年10月18日 : 1.5.6
2014年10月8日 : 1.5.5
2014年9月2日 : 1.5.4
2014年7月25日 : 1.5.3
2014年7月12日 : 1.5.2
2014年6月24日 : 1.5.1
2014年6月19日 : HAProxy 1.5.0 发布!
经过4年的辛勤工作,HAProxy 1.5.0 终于发布了! 对于那些不关注开发版本的人来说,1.5 在 1.4 的基础上扩展了许多新功能和性能改进,包括客户端和服务器端的原生 SSL 支持,带有 SNI/NPN/ALPN 和 OCSP Stapling;IPv6 和 UNIX 套接字在各处都得到支持;完整的 HTTP keep-alive,以更好地支持 NTLM 并在静态服务器集群中提高效率;HTTP/1.1 压缩(deflate, gzip)以节省带宽;客户端和服务器端的 PROXY 协议版本 1 和 2;对请求或响应中的所有内容(包括负载)进行数据采样;ACL 可以使用任何匹配方法和任何输入样本;maps 和动态 ACLs 可通过 CLI 更新;stick-tables 支持计数器以跟踪任何输入样本的活动;自定义格式用于日志、唯一ID、头部重写和重定向;改进的健康检查(SSL、脚本化 TCP、检查代理等);更具可扩展性的配置,可以轻松支持数十万个后端和证书。 自 dev26 以来,修复了一些错误,并集成了一些不那么重要的东西。Dirkjan 和 Emeric 提供的基本 OCSP Stapling 支持最终被合并。Sasha 的头部替换操作也被合并了。我在统计页面添加了一些更多信息(平均响应时间)和 CSV 输出(健康检查状态),添加了对接收端 PROXY v2 的支持,并在 tcp-request 上添加了“capture”操作,以便记录 SNI 或负载等内容。Rémi 的 dh-param 最终也被集成了。 人们喜欢数字,所以这里有一些。从 1.4.0 到 1.5.0,我们经历了: 此外,我们非常感谢一些组织赞助了某些高级功能的开发,这些功能需要专门投入一个人或一个团队相当长的时间(希望我没有遗漏任何一个): 别忘了给你的发行版打包者买杯啤酒,他们让你的生活更轻松。很难一一列举,但如果你不是从源码构建,你很可能正在运行由这些人制作和维护的软件包: 最后,我想特别提及在此期间我们最活跃的邮件列表支持者,他们通过分担开发人员的支持任务,并每天友好地帮助我们 800 名永久订阅者,使这个项目成为现实。非常感谢你们这些人: 对于在法国的 HAProxy 开发团队来说,是时候去办点事,买些香槟来庆祝这个时刻了 :-) 2014年6月7日 : HTTP/1.1 重装上阵
六年前,Daniel Stenberg 在 libcurl 邮件列表上通知,IETF HTTP 工作组主席 Mark Nottingham 发起了一项对现有 HTTP 实现的审查。由于 HAProxy 在此列表中被提及,Aleks Lazic 将此邮件转发到 haproxy 邮件列表,我尝试用我能提供的关于 HAProxy 的信息填写表格。那时 HAProxy 1.3.15 刚刚发布,没有 keep-alive 也没有 HTTP/1.1 支持。面对通过 HAProxy 在客户端和服务器之间大量的互操作性问题,我觉得这是一个加入工作组并从我的角度尝试改善情况的绝佳机会。令我印象深刻的是,参与者们专业而冷静地工作。没有人真正试图为自己的实现辩护,重要的是互操作性,即使这有时需要在他们的代码中进行更改。当然,不同类型的组件(例如:安全性、性能、复杂性等)关注点不同,常常导致长时间的辩论。和许多其他产品一样,HAProxy 也因规范的澄清而经历了不少代码变更。最近的例子是发生在谷歌 Chrome 用户在许多网站上看到 HAProxy 的 408 错误页面之后。 在这项积极的工作开始 7 年后(好吧,对我来说是 6 年,我开始得晚),该小组的努力最终产生了 11 个新的 RFC!前 6 个(RFC 7230 到 7235)取代了老旧的 RFC2616: 接下来的内容是关于认证方案和方法注册(7236 和 7237),以及一些在工作组中发起讨论但未由工作组推进的扩展(状态码 308,“Forwarded” 和 “Prefer” 头部)。 如果你正在实现一个 HTTP 代理(客户端、服务器、代理、网关或任何其他),请阅读它们。它们涵盖了许多在实际中遇到的边界情况,这些情况是由于协议在实际应用中的演变比文档快而产生的。前两个 RFC 已经是揭开协议神秘面纱、摆脱错误观念的很好起点。 接下来呢?HTTP/2.0 已经启动并进行了大约 2 年。是时候专注于它了! 2014年5月28日 : 1.5-dev26 : 希望是最后一个!
这个版本试图成为开发周期中的最后一个。改动非常少。agent-check 已完成。修复了使用 systemd wrapper 重新加载时可能出现的 CPU 繁忙循环。修复了在不太可能的配置中使用正则表达式时可能出现的缓冲区溢出问题。现在默认对字符串样本使用 "str" 匹配。最终版本没有考虑任何主要的新功能缺失,所以现在只会合并修复和次要更新。源代码和更新日志像往常一样可以在这里找到。 2014年5月10日 : 1.5-dev25
自 dev24 以来,修复了四个重要问题。一个可能导致内存不足时崩溃。另一个涉及 FreeBSD,共享会话缓存可能在没有加锁的情况下被使用,导致随机崩溃。最近对 HTTP 请求体转发的修复在使用balance url_param时随机导致暂停。最后,自 dev23 以来,ACL 上的参数 "-i" 和 "-n" 被忽略了。一些待处理的更改也已完成。现在支持半关闭超时。服务器端支持 Unix 套接字,Linux 上也支持抽象命名空间套接字。这使得后端和前端可以在不消耗 TCP 端口的情况下连接。旧的、未维护的 BSD 和 OSX Makefile 已被移除。通过在"process"行上使用"bind"关键字,终于可以实现每个监听器的进程绑定,这使得每个进程可以有一个 stats socket。PROXY 协议版本 2 在服务器端实现。还做了一些其他次要的改进。源代码和更新日志可以在这里找到。 2014年4月26日 : 1.5-dev24
这个版本修复了 dev23 的 3 个主要回归问题,一个导致传输在配置的超时后中断,另一个是重定向有时可能导致崩溃,还有一个减慢了 SSL 速度。其他小问题也已修复。统计页面现在支持分块模式、keep-alive 和压缩,并且可以在任何部分声明而不会有警告。健康检查可以在更短的延迟内启动。http-request/response 现在支持 set-map/del-map/add-acl/del-acl,可以根据从流量中提取的数据动态地向 maps 和 ACLs 添加/删除模式条目。即使在易受攻击的 OpenSSL 实现上,Heartbleed 攻击(CVE-2014-0160)也会被检测和阻止。源代码和更新日志可以在这里找到。
2014年4月23日 :
这个新版本解决了最终版发布前剩余更改的一半:use_backend支持 log-format 表达式。Maps 和 ACLs 现在共享相同的模式列表,这些列表可以从 CLI 动态更新。由于动态记录大小调整,SSL 网站现在加载更快。分块 HTTP 响应的压缩问题已修复并重新启用。大约修复了 35 个错误。我们越来越接近 1.5-final 了。源代码和更新日志可以在这里找到。 2014年2月3日 : 1.5-dev22
整个轮询系统终于被重构,用一个全新的事件缓存取代了 7 年前设计的推测性 I/O 模型。这是必要的,因为 OpenSSL API 与轮询 I/O 模型不完全兼容,因为它会将数据存储在其内部缓冲区中。其中一个好处是,尽管操作复杂,代码现在变得不那么棘手,也更安全了。当没有提到其他选项时,HTTP keep-alive 现在默认启用,因为这是用户在未指定任何内容并最终使用隧道模式时默认期望的。因此,为那些发现在使用隧道模式中有好处的用户增加了一个新的 "tunnel" 选项。在 HTTP 401 或 407 响应后,我们自动粘滞到同一台服务器,所以通常不再需要 "option prefer-last-server"。正如 Ilya Grigorik 建议的那样,SSL 缓冲区大小会自动调整以节省往返次数,将握手时间最多减少 3 倍。CLI 在 "show info" 中报告更多信息,并且现在支持 "show pools" 来检查内存使用情况。SSL 支持 "maxsslrate" 来保护 SSL 栈免受连接高峰的冲击。"tcp-check" 指令现在支持 "connect" 操作,从而实现多端口检查。在 1.5-final 之前还有很少的待处理更改:ACL/map 合并(正在审查),HTTP 主体分析器修复(进行中),代理检查更新(已开始),每个监听器的进程绑定(实验已完成)。源代码可以在这里找到。 2013年12月17日 : 1.5-dev21
昨天,几个早期测试者报告了一些恼人的错误,所以我倾向于迅速修复它们并发布另一个版本,而不是在这些错误上浪费大家的时间。请使用此版本代替 1.5-dev20 以确保安全。更多信息请参考更新日志。源代码可以在这里找到。 2013年12月16日 : 1.5-dev20 : keep-alive,终于来了!
鉴于一些更改的难度,这个版本花了6个月才发布,并收集了许多新功能。其中最受期待的是服务器端 keep-alive。这个功能的第一次提交最初是在差不多4年前尝试的。目前仍有一些限制,例如空闲的服务器连接不计入 maxconn,也不在统计信息中报告。而且option http-keep-alive仍然需要指定才能享受该功能。内存使用量已显著下降,在64位系统上每个空闲连接节省了640字节。所有样本获取表达式(包括 ACL)现在都支持应用于样本的转换器列表。新的map功能允许将输入样本转换为其他样本。最常见的用途是地理定位,但它也可以用于大量的重定向表。Maps 可以通过 CLI 实时更新。重定向支持日志格式语法,可以嵌入从请求中收集的一些元素。现在可以为每个后端选择哈希算法。健康检查通过agent-check和tcp-check构建发送/期望规则得到了改进。更多信息请参考更新日志。源代码可以在这里找到。 2013年6月17日 : 1.4.24 和 1.5-dev19 : 安全修复
在从 1.4.4 及以上的所有版本中发现了一个新的漏洞。它已在今天的 1.4.24 和 1.5-dev19 (CVE-2013-2175) 中修复。当使用涉及尾部相对头部偏移量的配置时,例如hdr_ip(xff,-1),这个漏洞可能导致崩溃。更多细节请参阅安全公告。所有 1.4 和 1.5 用户都必须升级。 此外,还修复了其他几个重要的错误。其中一个是 1.5-dev12 中引入的回归问题,在极少数情况下使用流水线请求且客户端较慢时,可能随机导致 haproxy 崩溃。最后,自 1.4 以来,在使用一致性哈希算法和服务器频繁变动时,可能会出现无限循环。 从积极的方面看,许多小型新功能最终被合并,例如 http-response 规则集、更改任务优先级的能力、DSCP 字段、Netfilter 标记和基于 L7 ACL 的日志级别、使用 ACL 选择性地接受 PROXY 协议头的能力、在 ACL 和 fetches 中支持环境变量、增加了第 3 个 stick-counter、统计页面上的过滤、FreeBSD/OpenBSD 的透明代理,以及其他一些东西。最后但同样重要的是,关于 ACLs/fetches 的文档进行了重大提升以去除关键字的重复。一些重要问题仍需解决,并且在最终的 1.5 发布之前,预计还会有服务器端 keep-alive,希望能在今年夏天结束前发布。 2013年4月3日 : 1.4.23 和 1.5-dev18 : 安全修复
所有 1.4 和 1.5 版本中的一个漏洞已在 1.4.23 和 1.5-dev18 (CVE-2013-1912) 中修复,该漏洞影响 TCP 请求检查规则中的 HTTP 获取。所有 1.4 和 1.5 用户都必须升级。 除此之外,1.5-dev18 带来了大量改进,其中包括在所有地址(bind、log、source、server...)中使用环境变量、基于代理的健康检查系统、对 systemd 的支持、TLS ALPN 以及其他一些不错的功能。 2013年4月1日 : 愚人节
我决定将 HAProxy 发射到气象气球中,以通过 WiFi 直接连接到附近的几个数据中心。 2012年12月28日 : 开发版 1.5-dev17
我在 dev16 中弄坏了一些东西,这些问题已经在 1.5-dev17 中修复。这是一个改动很少的小版本。因此,鼓励所有 1.5-dev 用户升级到 dev17。 2012年12月24日 : 开发版 1.5-dev16
1.5-dev16 来了。感谢 Sander Klein 和 John Rood 在 Picturae ICT 所做的出色工作,经过一周不懈的挖掘,我们终于找到了那个冻结的错误!这个错误通常极难复现,并且只在某些特定情况下影响 POST 请求,尽管我多次尝试都未能复现。很可能其他用户也受到了影响但没有注意到,因为最终用户没有抱怨(例如,我想到的是网络邮件和文件共享环境)。在这一周的代码审查和测试中,大约修复了 10 个其他与轮询更改相关的次要到中等错误。 另一个关于 SSL 的严重错误被修复了。原来 OpenSSL 维护着一个全局错误栈,必须不断地清空(他们肯定没听说过 errno 是如何工作的)。结果是,一些 SSL 错误可能会作为副作用导致另一个 SSL 会话中断。这个问题是由 J. Maurice (wiz technologies) 报告的,他第一次遇到是在 ssllabs.com 上进行测试时。 自 1.4 版本以来存在的另一个错误,涉及在 POST 上传结束前服务器响应时过早关闭响应。当服务器以重定向或 401 响应时,有时客户端收不到响应。这个问题已经修复了。 Krzysztof Rutecki 报告了一些客户端证书检查的问题,因为检查证书是否存在的操作适用于连接而不是会话。所以在会话恢复时这不匹配。因此,增加了另一个ssl_c_usedACL 来检查这类会话。 在其他不错的补充中,现在可以使用“%[]”来记录任何样本获取方法的结果。例如,这可以用来记录 SSL 证书。同样,将这类信息传递给 HTTP 头部的功能也已实现,即“http-request add-header” 和 “http-request set-header”,使用与日志相同的格式。这对于组合头部也很有用! 有人要求记录从客户端上传到服务器的数据量,现在可以通过“%U" log-format”标签实现。一些其他的 log-format 标签已被弃用,并替换为更容易记忆的标签。旧的标签仍然有效,但会发出一个建议替换的警告。 最后,统计页面的 HTML 版本得到了改进,使用悬停提示来呈现详细信息,而不是 title 属性,从而允许在页面上显示多行详细信息。结果更美观、更易读、更完整,可以在演示页面上看到。 2012年12月12日 : 开发版 1.5-dev15
这是在 dev14 基础上的一个增量修复,解决了自发布以来报告的几个剩余错误,特别是少数用户报告的高 CPU 使用率问题。一些 SSL 问题也得到了修复,其缓存也得到了改进,内存使用量减少了 4 倍。启用压缩的条件收紧了。多年来记录和计数的奇怪服务器错误实际上是客户端错误,这一点已得到修复。SSL 握手错误现在会被记录。现在可以跟踪第 7 层信息了;之前仅限于“src”。这将使代理背后的用户能够从一些抓取或 DoS 保护中受益。 因此,鼓励所有 1.5-dev 用户升级到 dev15。 2012年11月26日 : 开发版 1.5-dev14
2012年11月22日 : 开发版 1.5-dev13 带压缩功能!
这是有史以来发布的最大开发版本,2个月内有295个补丁!我们成功地让Exceliance团队一直忙碌,这意味着代码变得更加模块化,交叉依赖更少,我非常喜欢这一点!首先,我们从 dev12 的早期采用者那里收到了大量的反馈。看起来 SSL 的期待时间太长了。我们真心感谢所有贡献了补丁、反馈、配置、核心转储(是的,确实有)甚至实时 gdb 访问的人,你们知道自己是谁,你们值得一声大大的感谢!Git 日志显示自 dev12 以来修复了 55 个错误(其中一些可能是在此期间引入的)。尽管如此,这意味着应尽可能避免使用 dev12,这就是为什么我将你们中的许多人重定向到更新的快照。除了这些错误,我很自豪地说,整个团队做得非常出色,可以总结如下: 我必须说,我对 dev13 比对 dev12 更有信心,我已经升级了主网站,该网站每隔几天就会用最新的快照进行升级。我已经在 Linux i586/x86_64/armv5/v7、OpenBSD/amd64 和 Solaris/sparc 上构建并运行了它,不再有任何问题。 对于所有在 dev12 上运行 SSL 测试的人,请放弃它,改用 dev13。我不认为我们引入了回归问题(但仍有可能),但我确信我们修复了很多问题!通常的更新日志和源代码在通常的地方可以找到。 2012年9月10日 : 开发版 1.5-dev12 带 SSL!!!
这次最主要、期待已久的功能是客户端和服务器端的原生 SSL 支持,带有 SNI 和多进程会话共享。这项工作在 Exceliance 花了几个月的时间完成,因为它需要对底层连接层进行重大重写,以支持多个数据层。这是一项非常痛苦的任务,但这样做使我们能够将 SSL 补丁从数千行难以维护的代码缩减到几百行 SSL 特定代码。该代码支持服务器名称指示(SNI)TLS 扩展,即呈现与客户端请求的主机名匹配的证书。当然,这也适用于通配符证书。证书可以从一个目录加载,这使得一次加载数百或数千个证书更加方便。而且由于它们被加载到二叉树中,即使有数十万个证书也没有查找开销,这对于大规模托管提供商来说非常方便。 在当前状态下,代码尚不支持检查证书,这也意味着连接到 SSL 服务器仅在局域网安全的情况下才有用(简而言之,只有在服务器绝对希望将连接连接到端口 443 时才有用)。但 Exceliance 团队正在积极开展这项工作。 我们注意正确地安排连接和数据层。现在完全可以链接多个 haproxy 服务器层来卸载更多的 SSL,使用 SSL-ID 亲和性和 PROXY 协议,以免丢失客户端的源地址。使用现成的硬件这样做,即使对于巨大的负载,也可以得到相当便宜的 SSL 卸载器。我们在 Atom D510 上测量到 SSLv3 的 TPS 为 4000,并且尚未在更大的硬件上进行测试。 该版本的其他功能包括:IPv6 透明模式,“base” 模式/acl 用于匹配Host头和 URI 的串联,“urlp_val” ACL 用于匹配 URL 参数的值,支持 “nice” 关键字在 “bind” 行上更改使用此行的会话优先级(对于限制 SSL CPU 影响很有用),能够在 stats CLI 上清除/填充 stick-table 条目(这个功能在一个死分支中被遗忘了),以及通常的一套 halog 功能和优化。bind该 更新日志提供了更多信息,尽管有很多提交用于转换连接层。需要 SSL 的用户真的应该试一试。虽然我们在邮件列表中收到了一些有用的报告并修复了一些问题,但很可能还有一些错误存在,所以如果您观察到异常行为,请在那里报告您的经验。 在稳定分支方面,1.4.22 在一个月前悄悄发布,包含一些小的修复和一些次要功能改进,例如能够在管理员模式下从统计网页将服务器置于软停止模式,以及支持 cookie 上的 “httponly” 和 “secure” 标志。 2012年6月4日 : 开发版 1.5-dev11
自 1.5-dev10 以来,又修复了大量错误,其中一些是 1.5-dev8 及后续版本的回归问题。更多信息请参见更新日志,但任何人都不应在 dev9 或 dev10 上运行。dev11 中添加了一些次要的无害功能,例如统计页面上的新操作、一些新的 cookie 选项以及对 URI 哈希和服务器恢复模式的一些次要改进。用户真的应该升级,因为我不想浪费时间在明显有问题的配置中寻找愚蠢的错误。 2012年5月21日 : 稳定版 1.4.21
最近报告了一些旧的错误。其中一些问题相当严重,因为它们可能导致在解析配置或启动时崩溃,考虑到启动脚本通常不会注意到这一点,情况就更糟了。在1.4.21 修复的错误中,我们可以列出:如果使用 reqrep/rsprep 并手动将 tune.bufsize 配置得大于编译时的值,则有崩溃的风险;在 TCP 前端使用头部捕获时有崩溃的风险(未捕获的无效配置);在不使用 LB 算法的服务器场(例如:“option transparent”或“dispatch”)中声明了带检查的服务器时有崩溃的风险;“balance source”没有正确地哈希 IPv6 地址,导致到 IPv6 监听器的 IPv4 连接总是具有相同的哈希值。还合并了一些其他次要的修复和改进。虽然很可能几乎没有人受到上述错误的影响,但对它们进行故障排除已经足够烦人,足以证明升级是合理的。 2012年5月8日 : 开发版 1.5-dev9
自 1.5-dev7 以来,增加了许多新功能(我忘了在这里宣布 dev8)。让我们简要总结一下:新的日志子系统,具有可自定义的日志格式,一个唯一ID生成器,对缓冲区和 HTTP 消息存储的全面重构,ACL 和模式获取代码的合并,ACL 对 IPv6 地址、cookies、URL 参数和任意负载的支持,支持在获取函数中指定精确的出现次数,对 ACL 解析错误的更好的错误报告,期待已久的“use-server”指令,对错误捕获报告的次要改进,以及大量的错误修复。请测试一下。 2012年3月10日 : 稳定版 1.4.20
自 1.4.19 发布以来,报告了一些错误,并在 1.5 开发期间发现了一些。跟踪已禁用服务器的服务器在禁用后仍会被使用。权重为零的服务器仍然可以从后端队列中取出待处理的请求。自 1.4.19 以来,在 FreeBSD 上的构建已损坏。自从引入客户端 keep-alive 以来,如果服务器保持正好 maxconn-1 个连接,它在释放连接后不会拾取待处理的请求,这在 maxconn 值较低时是个问题。小于缓冲区的 POST 请求会经历不希望的额外 200 毫秒延迟,因为缓冲区上的一个标志被无条件地保持启用。有时当发送跨缓冲区的数据时,haproxy 会无法将 TCP 段合并成一个,这会导致一些 PUSH 数据包,在分块编码传输期间有时可以观察到(这只是一个错过的优化)。1.4.20 已发布,包含了所有这些更改。其中一些更改足够重要,足以证明升级是合理的,尽管它们已经存在很长时间了。 2012年1月8日 : 稳定版 1.4.19
自 1.4.18 以来修复了一些错误,并且它们影响了用户,所以我想现在发布一些东西,尽管它们都不是关键的。首先,Sagi Bashari 修复了"forwardfor"选项使用备用头名称的问题。Ludovic Levesque 诊断出服务器跟踪和慢启动之间的不兼容性:权重会永远保持在最低水平。Daniel Rankov 报告说option nolinger在后端不起作用。看起来这种情况已经持续很长时间了。Julien Thomas 诊断出 ebtrees 中字符串索引的一个问题。它在 ACL 中使用,理论上可能会影响 ACL 代码,尽管它没有可见的影响,因为同一 ACL 中的所有模式都是可互换的。Timothy Garnett 报告了一个问题,即 Ruby 客户端在响应时间上遇到了额外的延迟。分析了一些网络跟踪后,发现 Ruby 喜欢在多个不完整的数据包中发送 POST 请求,等待第一个被 ACK 后再推送其余的,这与延迟 ACK 不兼容。由于我们收到了不完整的请求,我们可以注意到它缺少数据并重新启用快速 ACK,以使客户端尽快发送其余部分。显然,客户端应该被修复,因为它的行为使其对网络延迟非常敏感。Brian Lagoni 报告说 TProxy 在 Linux 2.6.34 内核之后损坏了,因为地址族以前被假定为 AF_INET 并且没有在 HAProxy 中设置。最后一个错误,我受够了 HAProxy 阻止没有头部的无效服务器响应。我终于明白这是因为一些请求的 URI 中带有"\0",HAProxy 没有阻止,而 Apache 认为请求行被截断并忽略了 HTTP 版本,导致HTTP/0.9。所以请求解析器被修改为拒绝 URI 中的控制字符(标准禁止其他字符,但我们不能在稳定版本中改动太多,以免破坏某些设置)。合并了一个次要功能。Mark Lamourine 研究了一个在与服务器建立连接时在头部发送服务器名称的解决方案。我知道这在某些孤岛式设置中很有用,而且代码没有任何回归风险,所以我同意将其包含在 1.4 中。所以 1.4.19 发布了,包含了所有这些更改。如果您对当前版本没有问题,则无需升级。 2011年9月16日 : 稳定版 1.4.18
我在 1.4.17 中对头部中空格解析的修复并不完整,因为它会导致对完全由空格组成的头部返回负的头部长度。我已经检查了整个代码,看看这是否会有任何不良影响,但我找不到,因为每次我们都在检查内容之前检查长度(我们被一个优化救了)。尽管如此,我不喜欢让危险的代码躺在那里,尤其是在稳定版本中。例如,我知道有些人会在其之上应用自定义补丁,并可能陷入困境。所以我发布了 1.4.18,包含了那个修复。我还包含了 Finn Arne Gangstad 最近的补丁,也用 ':' 分割域名,因为我同意,每当指定端口时,主机名就很难检查。我还为头部长度添加了匹配,这样现在检查空头部就容易多了。其余的只是通常的文档和 halog 更新。我不认为有什么特别的理由要急于升级到这个新版本,但如果你正在升级一个旧版本,请避免 1.4.17,改用 1.4.18。 2011年9月10日 : 开发版 1.5-dev7
自 1.5-dev6 以来已经过去了五个月。自那时起,大量的更改被合并。其中大部分是清理和优化。一些更改致力于使监听器更加自治。直接效果是更稳健地处理资源饱和,第二个效果是移除了有10年历史的maintain_proxies()函数,该函数损害性能且难以克服。Halog 也得到了改进(速度更快,过滤器更多)。合并了大量外部贡献,其中包括更新 stats socket 以通过值清除会话表键。更改太多无法一一列举,但没有太危险的东西,所以我会说这是我今天最信任的 1.5-dev 版本。请测试一下。 2011年9月5日 : 稳定版 1.4.17
上周发现一个问题,一个应用程序在content-length值后发出空格,导致 haproxy 在解析时报告错误。经过一些检查,发现 haproxy 应该忽略这些空格,所以这个问题得到了解决。这是一个改进无效请求和响应捕获的机会,这样任何因格式错误而被拒绝的消息都可以被捕获。增加了一个新的次要功能,使X-Forwarded-For头的添加成为有条件的,因为用户过去不得不采取复杂的技巧来做到这一点。最后,halog 更新到了最新版本。由于上述头部的问题,我发布了 1.4.17。坦率地说,大多数用户不需要升级。但是,对于新的部署,最好使用这个版本。 2011年8月6日 : 稳定版 1.3.26 和状态更新
上一个 1.3 版本是在 14 个月前发布的,与 1.4.8 同一天。从那时起,一些修复进入了 1.4,其中一部分被排队等待进入 1.3。这些修复并不*那么*重要,但仍然值得发布。因此,1.3.26 和 1.3.15.13 都已发布,并以源代码和预编译二进制文件的形式提供,适用于 Linux/x86 和 Solaris/sparc。 我意识到我自己不再使用 1.3,因此我担心未来向后移植可能会引入回归的风险。所以我决定,在经历了 2.5 年的稳定发布和 5 年的存在之后,是时候将 1.3 转为“仅限关键修复”状态,这意味着次要修复可能永远不会再进入其中,未来的发布(如果有的话)将专注于重要的错误。这并不意味着它不再受支持,而是修复的速度会非常慢,并且鼓励新的部署使用 1.4,如果他们期望得到响应迅速的支持。 我还将 1.3.14 和 1.2 分支切换到“不再维护”状态,因为似乎没有人再使用它们了(最后一次修复分别是在 2 年多和 3 年多以前)。 2011年8月5日 : 稳定版 1.4.16
自 1.4.15 在 2 个月前发布以来,只检测到很少的次要错误。它们是如此次要,以至于值得等待发现其他错误,但一段时间后,再让用户等待也没有意义了,所以我发布了 1.4.16。还根据用户的反馈进行了一些次要的改进。在这些更改中,MySQL 检查现在支持 5.5 之后的 Mysqld 版本,修复了健康检查对多包响应的支持,可以为监视器响应配置 HTTP 200 状态,添加了一个新的http-no-delay选项来解决那些假设基于数据包传输的有问题的 HTTP 实现,分块编码传输得到了一些优化,统计界面现在支持 URL 编码的表单,并且 halog 正确处理截断的文件。没有真正的紧急情况需要升级。 2011年6月7日 : Country IP Blocks 需要帮助
相当多的 HAProxy 用户依赖 Country IP blocks 免费提供的地理位置列表,要么是为了添加一个指示来源国的请求头,要么是为了选择离客户端最近的数据中心。现在这个不错的服务需要一些资金来继续运营,否则他们将被迫关闭。他们在请求捐赠。他们的服务已经以高质量免费提供给许多 HAProxy 用户一段时间了,我认为这些用户反过来帮助他们不错的提供商是非常公平的。他们需要在下周前筹集 2000 美元,如果所有使用他们列表的大型网站各捐赠 100 美元让他们维持下去,这肯定是能够实现的。永远不要忘记,对于网络上任何免费的软件或服务,总有一些人在努力工作以维持服务的运行,并且在月底需要支付账单。 2011年5月31日 : HAProxy 参与 IPv6 日
大约两周前,我报名参加了世界 IPv6 日。这个概念非常简单:在 6 月 8 日,许多网站将同时支持 IPv4 和 IPv6。为什么只有那一天?因为存在一些可以解析 IPv6 但无法访问的地方,导致双栈网站在这些地方无法访问。通过让许多网站在同一天运行 IPv6,网络管理员会注意到问题出在他们的网站,而不是外部,因为许多网站将同时无法访问。 HAProxy 几年前曾运行双栈,但由于许多问题报告,我不得不恢复。不过,一些访客可能已经注意到那个小小的绿色图片,指示他们的浏览器是否可以连接到 IPv6。由于我在参与者列表上注意到一些网站已经启用了双栈,我决定提前在这里再次启用它,这样如果一些访客报告任何问题,我就能恢复它。如果在 6 月 8 日之前没有报告任何问题,我可能会让它保持启用状态。 不幸的是,作为网站缓存的 Dedibox 所在的网络尚未启用 IPv6。这真是一个遗憾,考虑到我们是从一个位于支持 IPv6 的网络上的旧机器升级过来的。我真的不明白 Free 为什么花了这么长时间才在他们所有的网络段上启用 IPv6,这似乎不是他们的首要任务。但由于网站是在我家的 Nerim 互联网接入后面运行的,这个接入已经启用 IPv6 大约 10 年了,我可以在 DNS 中宣布 ADSL 端点地址。 在您的网站上启用 IPv6 对于 HAProxy 来说确实非常简单。您只需在您的前端添加“bind :::80”,并在您的 DNS 区域中将 IPv6 地址宣布为 AAAA 记录,仅此而已。无需重新寻址,无需路由更改,没有什么花哨的。您甚至可以像这里一样获取 IPv4/IPv6 统计信息。顺便说一句,我确信一些世界 IPv6 日的参与者也用他们的 HAProxy 配置做了完全相同的事情 :-) 2011年4月8日 : 稳定版 1.4.15 & 1.5-dev6
在 Exosec,相隔一周,在 1.4 上检测到两个恼人的错误。第一个错误在 32 位平台上将可用的 content-length 限制为 32 位,尽管在代码中为支持 64 位数量做出了努力。然后在 1.4.14 中修复了它。昨天,在将 1.4 的修复向后移植到 1.3 时,我发现合并到 1.4.9 中修复 cookie 中空格问题的补丁由于一个拼写错误引入了一个回归。在某些情况下,服务器发送的格式错误的头部可能导致 haproxy 崩溃当启用基于 cookie 的持久性时。因此,1.4.15 作为紧急更新发布以解决此问题。这个错误从未被报告过,因为它出现的可能性极小,除非服务器故意触发它。 与此同时,1.5-dev4 发布了,包含了大量的修复和架构重组(多到无法在此列出),这些都是继续进行服务器端 keep-alive 工作所必需的。1.5-dev5 启用了服务器端 IPv6 支持并修复了一些剩余的错误。1.5-dev6 最终发布,以解决昨天列表上报告的最后几个回归问题以及上述重要错误。 现在,每个人都应该明白所有 1.4 >= 1.4.9 或 1.5 > 1.5-dev3 的用户都必须升级. 2011年3月9日 : 稳定版 1.4.13
在开发 1.5-dev 和用户使用过程中,都发现了许多恼人的错误。在移除最后一个头部后,一些头部没有被正确处理(Stefan Behte 向邮件列表报告的问题);从 CLI 禁用一个已禁用的代理可能导致段错误(Bryan Talbot 报告,Cyril Bonté 修复);“balance url_param”在 POST 请求上完全损坏(Bryan Talbot 也报告了此问题);理论上,如果 CR 作为缓冲区的最后一个字节发送,等待 LF 在后续数据包中换行,可能会导致 HTTP 块大小错误;从文件中加载的 ACL 在成功时没有正确关闭文件描述符(Bertrand Jacquin 报告);最近添加的 srv_id ACL 在服务器未知时可能导致段错误(Hervé Commowick 报告);监听套接字的 rlimits 没有正确更新(loadbalancer.org 团队报告);管理员模式下的统计页面不支持多包请求(Cyril 修复)。 1.4.12 发布时包含了所有这些修复,但 Hank A. Paulson 报告了一个由 1.4.11 中为正确处理空行而引入的回归问题导致的带空行的模式文件崩溃。因此,几小时后发布了 1.4.13 以避免任何问题。 我想感谢所有这些贡献者,因为详细的错误报告与代码贡献同等重要。再次,鼓励所有 1.4 的用户升级,以避免对愚蠢错误的无聊故障排除。这次我也添加了 Sparc 构建版本,因为仍然有这些请求。像往常一样,请检查更新日志,以及在通常位置的源代码和 Linux 二进制文件。 2011年2月10日 : 稳定版 1.4.11
综上所述,强烈建议所有 1.4 的用户升级。像往常一样,请检查更新日志,以及在通常位置的源代码和 Linux 二进制文件。 2010年11月11日 : 开发版 1.5-dev3
2010年10月29日 : 稳定版 1.4.9
在已修复的问题中,监听器可能在 accept() 期间内存不足的情况下处于不可恢复的状态。紧随 CRLF(禁止)的 POST 请求在一个较晚的数据包中可能导致在 Linux 上发出一些 TCP 重置,因为那两个未读字节(与 Dietrich Hasselhorn 一起诊断)。在处理请求时被禁用的服务器仍然可以从全局队列中消耗新的请求。用于 ACL 的 HTTP 头部处理没有正确考虑引号,并习惯于将引号内的逗号视为列表分隔符。地址为 0.0.0.0 的服务器过去依赖系统连接到这个地址(这总是它自己)。现在它以与透明模式相同的方式转发连接。各种错误报告和日志得到了修复或改进,许多文档拼写错误也得到了修复。 现在关于改进,Krzysztof Oledzki 改进了他的 netsnmp-perl 插件以支持监听套接字,并合并了 Mathieu Trudel 的 Cacti 模板。Judd Montgomery 和 Cyril Bonté 支持从统计界面设置服务器 up/down 的工作也已合并。Gabor Lekeny 添加了 LDAPv3 健康检查。Hervé Commowick 改进了 MySQL 检查,以支持使用真实用户名的完整登录序列。当设置了“abortonclose”选项并且客户端在等待服务器时断开连接,现在我们将关闭通知转发给服务器。这样服务器可以决定是继续还是关闭。这对于处理长轮询请求的服务器很重要。经过 18 个月的审查和各种人的修复,显式内容验证(ECV)检查代码终于合并了。这是延迟此版本发布的一个主要原因。健康检查现在可以依赖于在服务器响应中查找的字符串。持久性 cookie 现在支持不活动超时和生存时间。这对于一些新的终端(如 iPhone)是必需的,这些终端的浏览器从不关闭,并且终端永远粘在同一台服务器上(这在部分中断期间尤其不受欢迎)。此外,我们现在在“insert”模式下为 cookie 提供了一个新的“preserve”选项,该选项表示如果服务器设置了 cookie,那么我们让它不受影响地通过。这允许服务器在注销时终止持久性。最后,“halog”实用程序得到了改进,以支持按 url 和按终止代码的统计。这意味着现在很容易知道哪些 URL 耗费了最多的处理时间。 版本 1.4.9 发布时包含了所有这些内容,源代码和 Linux 二进制文件在通常的位置。其中一些修复也将进入 1.3。 2010年10月23日 : 新的 httperf 结果 : 572000 reqs/s
Kristian 说他使用了 httperf。我过去试过它,但没能从中获得好的数据。他说他发现了一些“httperf 的秘密”,这让我想再试一次。最初的测试在使用 httperf 且 CPU 占用率 100% 的情况下,被限制在每秒大约 50000 次请求。这和我记忆中的情况差不多。但是通过阅读手册,我发现 httperf 可以在基于会话的模式下工作,使用"--wsess"参数,这种模式下它还支持 HTTP 流水线。嗯,不错,这样我们对数据包往返的敏感度就会降低 :-) 所以我再次尝试,让 haproxy 简单地做重定向。性能仍然被限制在每秒 50000 次请求。
当然,这些测试对于现实世界的使用来说毫无意义,因为当你有许多客户端时,它们不会向你发送大量的流水线请求。然而,能够对 HTTP 引擎进行压力测试以进行回归测试是非常好的。当端到端 keep-alive 完成后,这将是一个宝贵的测量工具,用来测试它。我仍然需要弄清楚一些选项的含义,以及如何使该过程不那么冗长。现在它用很多零充满了屏幕,使得提取有用的数字变得困难。我很感谢 Kristian 让我重新审视了 httperf! 2010年8月26日:devel 1.5-dev1 带来众多好东西
另外,我必须说,作为一名软件工程师,有人带着高期望来解释他们的需求,总比自己去猜测一个功能将如何被使用要好得多。 Geoff Dalgas 和 Jeff Atwood 非常详细地向我描述了他们需要做什么:根据各种标准,对每个 IP 地址进行请求限流,以限制服务滥用的风险。这非常有趣,因为这个功能已经构思了大约 4 年,但一直没有足够的时间来完全开发它,而且由 Exceliance 和 Loadbalancer.org 贡献的新粘性会话框架使得这成为可能,尽管首先需要在代码内部进行一次重要的设计重构。 在与 Geoff 和 Kyle Brandt 的测试期间,情况表明还需要进行一些更多的更改,以便能够在表中存储任何标准(例如:每个 IP 地址的带宽),并且能够在运行时查询和更改表内容,这导致代码变得越来越通用。Kyle 非常有耐心和理解力,我想在测试期间我至少更改了 5 或 6 次机制和配置语法,但他总是花时间去理解这些变化并调整他的配置。如果我处在他的位置,我早就感到厌烦了,所以我非常感谢他的耐心! 现在代码已经在他们的生产环境中运行良好,所以是时候发布它并将其合并到主分支了。我不会再详细介绍它的工作原理,因为 Kyle 在他的博客上发表了一篇极好的解释,比文档清楚得多(这提醒我架构指南确实需要一些改进了)。 我将快速介绍一下当前代码的状态。一些我早先想做的核心更改现在将开始。但这意味着 1.5-dev1 应该和 1.4.8 一样稳定。我不是说我会建议任何人将其推送到生产环境,但它显然可以用来缓解 DDoS 攻击以及阻止服务滥用。我能让它在略高于每秒 200000 次连接(是的,二十万)的情况下阻止连接洪水,并让正常流量通过。所以出于这个原因,我认为经常面临这种麻烦的人可能会发现把它放在手边很有用。 那么接下来是什么?目前表中的数据是单个进程本地的,所以如果你启动多个进程,它不会被共享,在重载时也不会。由 Exceliance 和 Loadbalancer.org 开发的粘性会话扩展的第二步将包括在多个主机之间同步粘性表。要能够共享计数器还需要一些工作,但由于这项开发是以一种灵活的方式进行的,以后适应它应该不会太难。顺便说一句,我还要向 Git 版本控制系统致以崇高的敬意,它通过大量使用分支和变基,使得在每次更改和错误修复后重构我的补丁直到它们看起来很好变得非常容易。 说得太多了。代码在这里,更新日志在这里,文档在这里。由于这是一个开发版本,不提供二进制文件。 最后的话自然要送给 Stack Overflow 那帮非常酷的家伙们。很高兴看到一些网站和公司投入时间和金钱,并承担风险来让开源产品变得更好。当然他们也从这项工作中受益,但在整个开发过程中,他们从未试图将重点缩小到他们的特定需求上,恰恰相反。从最初的交流开始,他们的目标就很明确,那就是让产品变得更好,这一点必须强调。现在这个目标已经实现,我非常感谢他们的参与。谢谢你们! 2010年6月16日:稳定版 1.4.8 和 1.3.25
版本 1.4.8 已经发布,源码、Linux 和 Solaris 的二进制文件都在通常的位置。版本 1.3.25 也发布了,附带了一些其他待处理的修复,源码和 Linux/Solaris 的二进制文件也在通常的位置。 使用 1.3.16 之后版本的 1.3 用户,或者使用仅有 TCP 前端的 1.4 用户很可能需要升级,尽管如果他们还没有遇到过问题,他们可能永远也不会遇到。使用 stick-table 的用户也必须升级。我们现在能发现已经存在两年的错误,这是一个令人鼓舞的稳定性迹象。
2010年6月10日:稳定版 1.4.7
有些人会喜欢新的halog,因为它能够报告每个服务器关于状态码、错误率、平均连接时间和响应时间的统计信息,这对于快速检查生产环境的健康状况非常方便。 另外,有人在邮件列表上问 haproxy 在 Guruplug Server Plus 上的表现如何。我几个月前订购了一个,终于收到了。嗯,它简直是个灾难,不仅比 Geode 慢,而且发热量巨大,金属部件摸起来烫手,电源适配器几个月后就烧坏了。绝对不是值得购买的东西。如果你感兴趣,可以点击前面的链接查看完整评测。 2010年5月16日:稳定版 1.4.6
2010年5月13日:稳定版 1.4.5
首先,Cyril Bonté 提供了新的 ignore-persist 指令。它允许 haproxy 在某些验证了基于 ACL 的条件的请求上忽略持久性 cookie。它特别适合于在一个有状态的服务器群中优化静态或无状态对象的负载均衡。 其次,三年前就计划能够用从文件中加载的大数据集来填充 ACL,但由于缺乏明确的需求,一直没有实现。现在,三年后,越来越多的人报告编写大型配置的困难,我看到的最后一个长达 104000 行的配置让我相信,支持这个功能是迫在眉睫的。但是针对非常大的数据集匹配请求可能会消耗大量 CPU,所以我扩展了我的弹性二叉树来支持新的查找方法,现在可以在几十纳秒内在成千上万个字符串或 IP 地址中查找一个。这意味着现在可以使用 haproxy 来执行地理定位。例如,检查一个源地址是否属于 38400 个欧洲网络之一,在每秒 40000 次请求时只消耗 2% 的 CPU。 其余的都只是一些小的改进。现在可以根据从 HTTP 头中提取的 IP 地址进行粘性会话,我还稍微改进了 halog 分析器,现在它能够按状态码报告请求计数。它还获得了一些不错的性能提升,现在可以在一个 3 GHz 的酷睿 2 处理器上每秒解析约 1.3 GB 的日志。 我预计这个版本需要一些时间来普及,因为它只包含新功能,很可能不会被各种发行版向后移植。不过,一些高级用户可能会有兴趣尝试一下。 2010年4月7日:稳定版 1.4.4
中添加 option http-pretend-keepalive 即可使用。Jetty 的 HTTP 实现似乎是最不稳定的。它甚至在客户端发送 "Expect: 100-continue" 时,会发送 "HTTP/1.1 100 Continue" 中间响应,但它在那条消息之后就关闭了连接,导致客户端出现 502 错误。 Cyril 还修复了一个appsession的问题,即一个名称以 appsession cookie 开头的 cookie 可能会被误认为是它。这些问题足以成为发布新版本的理由。 这里还带来了其他一些非常小的修复,并增加了一个小功能。它包括在连接到服务器时,能够绑定到一个在头部中找到的源地址。通常这将是 X-Forwarded-For 头部。这需要使用 Linux 内核的 TPROXY 补丁,并使得后端服务器即使在经过多层代理后也能看到初始客户端的 IP。 2010年3月30日:稳定版 1.4.3 和 1.3.24
值得注意的是,在 1.4.2 上报告的问题非常少。代码已经非常快地稳定下来,在敏感环境中的人们可以开始考虑评估它以计划升级(从大多数报告来看,新功能如客户端 keep-alive 和改进的统计数据非常受欢迎)。如果我能给他们一个建议,我会说我们很快会发布 1.4.4,带有一些小的改进,如果有些人不知道他们将从哪个版本开始,那么就在 1.4.4 可用时从 1.4.4 开始吧。 2010年3月17日:稳定版 1.4.2
2010年3月5日:稳定版 1.4.1
另外,Solaris 用户现在会很高兴,我拆开并重新插上了我的 Ultra5,所以 Sparc 二进制文件又可以用了。 另外,我删除了指向 haproxy.org 镜像的链接,因为它在过去 6 个月里一直过时,甚至在一个过期的 DNS 区域上停留了 1 周。我多次尝试联系那里的 Kevin Kuang 都没有成功,所以我甚至不知道现在是谁在管理它,如果还有人的话。如果有人联系到他,请让他联系我。 2010年2月26日:新的稳定分支 1.4!
2010年1月28日:稳定版 1.3.23
2010年1月25日:1.4-dev7 和 1.4-dev8
2010年1月16日:4 小时网络中断
2010年1月8日:1.4-dev6
2010年1月2日:新年,新功能
为了在客户端启用流水线,只需注释掉"option httpclose"在defaults, frontend和backend部分中的任何语句,并设置"option http-server-close"在其中任何一个部分。顾名思义,连接在服务器端仍然是关闭的。这样我们仍然可以在服务器上保持较低的资源使用率,并正确执行maxconn,同时与客户端保持 keep-alive。 这段代码将在周末结束前出现在 1.4-dev5 中,但迫不及待的人可以下载一个快照进行测试。 新代码已经在 Formilux 服务器上进行了测试,并且在这个页面上已经显示出相当可观的加载时间节省。敬请关注... 2009年10月18日
2009年10月14日:1.3.22
2009年10月12日:1.4-dev4, 1.3.21
2009年9月26日
2009年9月24日:1.4-dev3 + 赞助商
与最新的稳定版 1.3.20 相比,1.4-dev3 提供了新功能,其中包括支持 CLF 日志格式、RDP 协议负载均衡和持久性、一个新的交互式 CLI、一个改进的 HTML 统计页面、支持在 TCP 前端检查 HTTP 内容并切换到 HTTP 后端(允许 HTTP+SSL 在同一端口上共存)、支持在前端强制 TCP MSS、智能网络优化以减少会话中的 TCP 数据包数量、运行时可配置的缓冲区大小、支持超过 64k 个并发连接、配置解析器支持"no option xxx"来禁用默认启用的选项,以及正确的 1xx 状态码处理。支持 keep-alive 的开发已经开始,如果时间允许,将尝试 SSL 集成。考虑到更改的数量,代码看起来惊人地稳定,并且可能不会再有太大变化,所以在这个版本中发现的任何错误都必须报告和修复。此外,新的功能提交应基于此版本。这对提交者来说实现更容易,对我来说合并也更容易。 几个大型网站已经在 1.4-dev2 上成功运行。这一个应该会更好,但考虑到更改的数量,一开始应该更密切地监控它。 最后,我有一个非常好的消息,我希望这能给其他人带来一些想法:Exceliance 和 Loadbalancer.org 都同意贡献一些人力和资金,在 haproxy 中实现每个人都梦寐以求的完整持久性框架。这是一项艰巨的工作,我不确定它是否能为 1.4 准备好(尽管可能,取决于我是否像往常一样发布延迟)。我个人要感谢他们两位的贡献。当您不得不把钱投入商业解决方案时,请永远不要忘记先咨询那些在开源项目中投入时间和金钱的人,因为是他们帮助项目发展和生存! 2009年8月9日:1.3.20
另一个错误是由 Romuald du Song 报告的,他发现option tcplog如果没有定义记录器,将使用全局参数进行记录。这可能既有帮助又烦人。现在已经修复,并且当遇到这样的配置时会发出警告,以便运行错误配置的人可以轻松修复它们。 这次我期望 1.3.20 是好的那一个。当我们修复由错误修复引入的小错误或最近的回归时,这总是一个好兆头。1.4-dev2 也已发布,以帮助人们并行跟踪两个版本中的变化。 2009年7月27日:1.3.19
由于上述一些错误在早期版本中也存在,因此也为 1.3.15 和 1.3.14 发布了新版本,供尚未升级的晚期用户使用。我真的认为这是 1.3.14 的最后一个版本了。1.3.15 可能在年底前还会有另一个版本,在那之后,经过 20 个月的免费支持,这一个大概也就到此为止了 :-) 第一个开发版本也应该发布了,但我需要先更新我的发布脚本,它们不合适,用起来太费时间,所以敬请期待! 2009年6月27日:HAProxy 对抗 DoS 攻击
确实,HAProxy 不需要新的线程或进程来接受新的连接,它只需要一些内存(每个连接 16-32 kB)。一些人已经在使用它超过 70000 个并发连接,这在 Apache 上是无法实现的,Apache 每个连接需要一个昂贵的线程或进程。更具体地说,HAProxy 只会转发完整且有效的请求。这意味着当攻击者在玩弄他那几千个连接时,它不会打扰 Apache,所有有效的请求都会立即通过。而锦上添花的是,HAProxy 可以终止花费太多时间完成的请求,使用timeout http-request(超过几秒钟不应被视为正常)。 我们再次观察到负载均衡器的衍生用途,这有点在意料之中:当一个工具被设计成能够接受比它所服务的服务器多 10 倍的负载时,它能被用来保护它们也就不足为奇了!让我们看看 Apache 是否会发展到提供更多的可调参数来减轻此类攻击……在此期间,一个即插即用的反 DoS 配置在这里可用。 2009年5月10日:1.3.18
的池共享。感谢你们的巨大帮助和你们让那个进程运行所承担的风险!在与 T20 的伙计们(来自 modX 团队的 Maxim Fedchishin、Jason Coward 和 Viktor Brilon,来自 RightScale 团队的 Hans)进行故障排除时,我遇到了一个在软重载后什么也不做的旧遗留进程。这个问题时不时地被不同的人提出,但它发生得太少了,以至于没有人有机会去调试它。这些伙计们同意我在他们的机器上安装一个调试器,看看这个进程在做什么。它在重载期间死锁在free()在与 T20 的伙计们(来自 modX 团队的 Maxim Fedchishin、Jason Coward 和 Viktor Brilon,来自 RightScale 团队的 Hans)进行故障排除时,我遇到了一个在软重载后什么也不做的旧遗留进程。这个问题时不时地被不同的人提出,但它发生得太少了,以至于没有人有机会去调试它。这些伙计们同意我在他们的机器上安装一个调试器,看看这个进程在做什么。它在重载期间死锁在中。这很有道理:在重载期间,旧进程会尽可能多地释放内存,为新进程留出空间。如果第二个进程发送的两个信号彼此太近,第二个信号会在第一个信号还未完成释放内存时发送,我们可能会在 libc 的 free()中出现递归,导致死锁。这已经通过实现异步信号传递得到了修复。感谢你们给我机会捕捉到这个罕见的事件!问题之外,合并了一些小的功能。统计现在更具可读性,报告最大会话速率,并处处提供完整的 64 位计数器。现在可以转发无效的请求或响应而不阻塞它们,但它们仍将被捕获。配置解析器现在会警告 ACL 或 reqxxx/rspxxx 可能不希望的排序。修复了几个错误的 printf() 格式字符串。构建过程现在支持备用架构,并且 RPM spec 文件已被清理。添加了一个新的 balance hdr(header) 算法,以根据头部哈希进行平衡。一个新选项可以在 X-Original-To 头部中添加目标 IP 地址。最后但同样重要的是,文档被大规模地清理和重组了。
2009年4月19日:新的性能记录被打破!
2009年3月29日:1.3.17 who's.amung.us 的 Bart Bobrowski 报告了新版本 1.3.16 的异常 CPU 使用率。经过一整天的测试和代码分析,我在这里无法复现这个问题,而且这个错误对我来说似乎是不可能的。然后 Bart 提供了大量的帮助,测试了许多补丁,提供了数百兆的跟踪信息,这样我最终才能修复由一个讨厌的竞态条件引起的问题。我非常感激当拥有极端负载的用户同意在生产环境中进行跟踪时,尽管这种做法意味着各种风险。有时这是修复错误的唯一方法。谢谢你,Bart!
2009年3月22日:1.3.16!
2009年3月10日:1.3.16 越来越近了! 1.3.16 的第二个发布候选版已经发布。它带来了许多期待已久的新功能,其中包括 TCP 拼接支持、条件重定向、TCP 内容过滤、会话速率报告和限制、无效请求/响应捕获、绑定到特定网络接口、前端和后端的进程亲和性、单调内部时钟以及许多其他功能。 内部终于被分层重构,以便可以在不唤醒高层的情况下处理转发。HTTP 现在位于 TCP 之上,而不再是它的一个特例。这些变化的一个大优点是,我们现在可以接触套接字代码而不影响 HTTP,反之亦然,这在此之前是不可能的。这意味着未来由功能添加引起的回归风险将显著降低。多亏了这些变化,许多复杂的技巧和特殊情况现在都以更清晰、更具演进性的方式处理。关于 keep-alive、SSL 集成和 QoS 的新工作将更容易。
2009年3月9日
2008年12月4日
2008年10月12日 时不时地,有用户报告说在软重启后一些旧进程仍然存在。我一直无法复现这个问题,直到 Manuel Soto 给我发了一个配置的 truss 输出,用这个配置问题会频繁复现。原因最终是 haproxy 仍然将监听地址绑定到禁用的实例,但不尝试停止它们,并且只要它们存在就拒绝退出。我借此机会修复了一个相关问题,该问题导致在 haproxy 尝试停止后端时发出警告,以及如果 ACL 在 defaults 部分中声明,则在配置解析器中出现段错误。
2008年9月14日
一个很酷的连接调节机制(maxconn)的视频演示已经发布在 37signals 上。它的解释清晰明了,足以让不太了解该机制的人理解。去看看吧,它不长,而且真的值得一看。
结构来对 POST 请求中存在的参数进行哈希的人来说。对于某些无效请求,存在崩溃的风险(但不会危及服务器)。幸运的是,这个功能非常新,并且非常局限于小众用户,但它仍然需要快速修复。其他错误都非常小,大多数都与超时处理方式的小问题有关。
tcp-request inspect-delay 35s tcp-request content reject if REQ_CONTENT 。我的一个大量使用 HAProxy 的主要客户赞助了对一些初步内容检查的开发,这些检查用于决定是否转发一个连接。这个功能的最初用途是检查一个连接上只讲 SSL。但很可能很快就会有更多的协议。作为一个不错的副作用,我现在可以在我的 SMTP 服务器的 HELO 消息前增加一个延迟,并拒绝所有先说话的机器人(被禁止)。而且由于许多垃圾邮件机器人有很小的超时值,它们中的许多在超时到达之前就中止了,导致我收到的垃圾邮件率从大约每小时 300 封下降到“只有”每小时 150 封。那些能坚持到超时的机器人由于资源有限而变慢。这个小小的增加仅仅在于在前端添加这两行:
haproxy 版本 1.3.15.2 和 1.3.14.6 已经发布,以修复请求队列处理中的一个主要错误。问题在于,由于设计问题,新请求有可能在队列中的请求被服务之前立即被服务器服务。这导致一些请求停留在队列中直到它们达到队列超时,之后它们要么最终被服务,要么向客户端返回一个 503 错误代码。由于这是一个设计问题,分析根本原因和找到解决方案花了很多时间。然而,作为一个积极的副作用,这个修复现在使得redispatch由于这是一个设计问题,分析根本原因和找到解决方案花了很多时间。然而,作为一个积极的副作用,这个修复现在使得选项对溢出队列的请求起作用。这样,客户端就不再得到 503 错误,而是可以由另一台服务器服务(这正是该 选项的目的)。 请注意,1.2 版本也可能受到这个问题的影响,因为故障代码的某些部分自那时以来没有改变。但很难确定它是否有故障,而且向后移植修复将花费更多时间。如果有人抱怨这个问题,也许我最终会看一看。更新 (2008/06/28) Alexander Staubo,他最初注意到了这个问题,已经进行了一系列新的测试,表明问题已经彻底解决。它还展示了在 Rails 服务器上运行 maxconn 1 的非常好的积极效果。
调用很少被调用。在 3.4 GHz 的奔腾 4 上,在这种负载下获取统计页面观察到了约 40 秒的延迟。顺便说一句,其他轮询器也好不到哪里去。修复方法在于确保轮询事件的检查频率与推测事件一样高。有了这个修复,在这样一台饱和的机器上,统计页面在不到一秒的时间内响应。不过,依赖事件优先级还有改进的空间。版本 1.3.15 已被提升为推荐版本,因为没有回归报告。版本 1.2.18 也已发布,供那些在 BSD 上构建遇到问题的 1.2 用户使用。
。更多信息,请查看 更新日志。由于变更数量巨大,从早期版本升级时应稍加小心。 再一次,很多代码来自贡献。我特别要感谢 Krzysztof Oledzki 提供了许多有用的贡献,包括 SNMP 代理,以及 Nokia 的伙计们在 POST 参数哈希方面所做的出色工作。
我终于组装好了我的新机器,并安装了捐赠的 10G Myricom 网卡。我进行了一些基准测试。结果:HAPoxy 创造了新的带宽记录:9.897 Gbps 和 35128 hits/s! 这可能是迄今为止开源负载均衡器实现的最高比特率!顺便说一句,即使是大多数商业负载均衡器,通常也因硬件设计而被限制在 4 Gbps。对于像我这样的精度调整狂来说,有点令人沮丧的是,这些网卡在廉价硬件上开箱即用,突破最初的 4 Gbps 几乎没有任何乐趣 :-)
发布了 haproxy 维护版本 1.3.14.3,以解决几个小错误并稍微清理一下配置手册。修复了轮询模式下备用服务器的一个恼人问题。这个版本没有真正重要的改变,这使得它成为发行版更新的好选择。
我最终决定买一块昂贵的主板来升级我的电脑,以便开始用 10G 网卡进行测试。我选择了一块华硕 P5E3-WS Pro,因为我需要 PCI-X 插槽来插我的旧卡。我装了一颗酷睿 2 双核 E8200 (45nm),因为我想要非常安静。主板有 2 个 PCI-E 16x 插槽,这使我能够在两块 10G 网卡之间进行背对背测试。由于主板不支持 PCI 显卡,我不得不通过串口启动(我在这块主板上唯一能运行的 VGA 卡是一块廉价的垃圾 GeForce 8400 GS,它在 X 下无法工作)。嗯,我的第一次测试相当鼓舞人心:我可以在同一台机器上的服务器和客户端之间的两块网卡之间实现 10 Gbps 的 HTTP 流量,这意味着硬件将能够在相同条件下支持 haproxy。我试了客户端 + haproxy + 服务器,但比特率下降到大约 6-7 Gbps。我迫不及待地想买另外 3 块主板来搭建一个完整的实验室。我将混合 2 个 Athlon 和一个 C2D,这样我就可以实验哪一个更适合哪种类型的流量。敬请关注!
2008年1月13日
2007年12月12日:圣诞老人在 EXOSEC 给我留了份礼物!
2007 年 12 月 6 日
2007 年 10 月 18 日
2007 年 9 月 22 日
2007 年 9 月 20 日
2007 年 9 月 5 日
2007 年 7 月 15 日
2007 年 6 月 17 日
2007 年 6 月 3 日
2007 年 5 月 14 日
此版本中的新功能是更好的计时器管理和一个新的内存管理器,它能够自我管理其内存池,并在内存变得稀缺时释放未使用的内存池。使用这个新的管理器编码也更容易,因为它不再需要声明池的大小。总体而言,又获得了5% 的性能提升。 2007 年 5 月 10 日
2007 年 5 月 9 日
2007 年 5 月 9 日
。1.3.9 中的推测性 I/O 处理引入了一些错误,这些错误已在此版本中修复。我相信最新的更改也带来了一堆错误。我可能很快会花一些时间进行清理和稳定工作,尽管这两者并不真正兼容。 我还要感谢所有贡献代码和测试的人。你们在每个版本中都越来越多。我迫不及待地想清理旧代码的残余部分,以便更多的人可以贡献代码。有趣的是,到目前为止,所有的贡献都是高质量的。这可能是由产品本身的技术性以及使用开发版本所需的技能所造成的某种筛选效应。再次感谢你们所有人! 2007 年 4 月 22 日
2007 年 4 月 15 日
还引入了一个新概念:推测性 I/O。这是一种新方法,通过在收到文件描述符就绪通知之前尝试访问它们,来减少对昂贵的 epoll_ctl() 和 epoll_wait() 的调用次数。这提供了大约 10% 的整体速度提升,对于仅仅一个轮询器来说,这是相当可观的。 2007 年 4 月 3 日
2007 年 4 月 1 日
2007 年 3 月 25 日
与每个版本一样,一些代码优化带来了虽小但显著的性能提升,特别是在非常高的数据带宽下。现在,配置错误的处理更加优雅,会指出失败的原因并提供解决问题的提示。感谢 Dan Zinngrabe 提供的 makefile,HAProxy 现在可以在 MacOS 10.4 上构建。此外,感谢 Fabrice Dulaunoy 的补丁,现在可以将健康检查发送到备用服务器地址。 鼓励 1.3 版本的用户升级到 1.3.8,因为它既修复了已知错误,又比以前的版本更加稳定。 2007 年 3 月 17 日
架构手册已更新,以反映 1.2 分支中的新功能,并提供了 stunnel 和负载缓解的示例。 鼓励高负载的 1.2.16 用户升级到 1.2.17,因为它提供了 1.3 分支的高性能和稳定分支 1.2 的可靠性。 2007 年 1 月 27 日
2007 年 1 月 22 日
请求处理代码已经进行了大量清理,并适配了这个新的 FSM。现在,基于新标准添加第 7 层规则变得非常简单。响应处理代码将在接下来进行移植,但由于代码已经变得如此简洁和快速,值得在破坏一切之前发布一个版本。自 1.3.5 以来,修复了几个错误。我确实认为1.3.6 是迄今为止最可能可靠的 1.3 版本。 2007 年 1 月 7 日
第二个好消息是,Sin Yu 第二次为我提供了一个有用的补丁:任务调度器现在基于红黑树(rbtree),而不是那个陈旧的双向链表。这意味着那些曾经遇到性能问题,不得不将所有超时设置为相同值作为变通方法的人,将不再需要这样做。我测试过了,代码运行得非常完美!再次感谢 Sin! 2007 年 1 月 2 日
现在可以根据请求中的任何参数来选择一个后端(服务器池 + 负载均衡算法),例如URI 的任何部分、主机名等等……目前,我已经合并了 Sin Yu 的补丁,允许基于请求正则表达式进行切换,但框架已准备好接受许多其他标准。HTTP 请求解析器已完全重写,以支持无限的头部检查,并且统计页面也已重写,正如在演示页面上看到的那样。它还远未完成,但看起来相当可用。不过,服务器状态机应该进行调整。 目前还没有文档,但请注意,旧的配置仍然有效,并且为了从一个实例切换到另一个后端,您需要使用“reqisetbe <regex> <new_proxy>”。此外,这里有一个配置示例,它比任何文档都更有价值。 2006 年 12 月 5 日
2006 年 7 月 4 日
联系方式如有任何问题或意见,请随时通过以下方式与我联系 |