我们如何用 Nginx 1.25 替换 Apache 并将 API 的反向代理延迟降低 25%

发布日期:2026-04-29 10:02:25   浏览量 :2
发布日期:2026-04-29 10:02:25  
2

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

在 18 个月的时间里,我们的应用程序接口网关的第 99 百分位反向代理延迟一直徘徊在 210 毫秒,导致我们每月浪费 1.8 万美元的计算资源成本,并造成高频应用程序接口用户的流失率达到 12%。我们将阿帕奇 2.4.57 替换为恩吉克斯 1.25.3,将延迟降低了 25%,降至 157 毫秒,且未发生任何计划外停机。以下是我们具体的实施方法,包含基准测试、代码和真实的生产环境数据。

📡 黑客新闻当前热门故事

  • Ghostty 正在离开 GitHub(1639 分)
  • ChatGPT 投放广告。以下是完整的归因循环(111 分)
  • GitHub 之前(254 分)
  • Claude 系统提示词漏洞浪费用户资金并导致托管代理瘫痪(65 分)
  • 面向创意工作的 Claude(35 分)

关键洞察

  • 在高并发应用程序接口工作负载下,恩吉克斯 1.25 的 io_uring 异步事件循环相比阿帕奇的预派生多处理模块,减少了 40% 的上下文切换
  • 在低于 10kB 的 JSON 应用程序接口响应的第 99 百分位延迟方面,启用 HTTP/3 的恩吉克斯 1.25.3 比阿帕奇 2.4.57 性能高出 22%
  • 迁移消除了每月 1.8 万美元的阿帕奇工作节点过度配置成本,工程时间的投资回报期为 6 个月
  • 根据高德纳咨询公司的数据,到 2026 年,70% 的新应用程序接口网关部署将默认使用恩吉克斯 1.25 或更高版本,或兼容的事件驱动代理

为何阿帕奇无法满足我们的应用程序接口工作负载需求

我们使用默认的预派生多处理模块运行阿帕奇 2.4.57 长达 3 年,起初我们的应用程序接口每日活跃用户不足 100 人。预派生多处理模块为每个传入连接生成一个专用的子进程,这在低并发工作负载下表现良好,但随着我们扩展到 1.2 万每日活跃应用程序接口用户、每天发送 4,000 万次请求时,它成为了瓶颈。每个阿帕奇工作进程消耗约 25MB 内存,因此 150 个最大请求工作进程(预派生的默认值)在峰值时占用 3.75GB 内存,留给同一弹性计算云实例上的节点.js 应用程序接口服务的余量寥寥无几。在 150 个工作进程之间进行上下文切换,在峰值时每秒增加 12,400 次上下文切换,我们的性能分析显示这占了第 99 百分位延迟的 30%。我们曾尝试切换到阿帕奇的事件多处理模块,但它与我们的代理模块和重写模块规则存在兼容性问题,且仅将第 99 百分位延迟降低了 8%,远低于我们的需求。

原始阿帕奇 2.4 反向代理配置

以下是我们在 18 个月内使用的完整阿帕奇虚拟主机配置,服务于所有 127 个应用程序接口端点。它包括安全套接层终止、负载均衡、速率限制和错误处理。

# 阿帕奇 2.4.57 应用程序接口反向代理配置\n# 部署于亚马逊网络服务弹性计算云 m5.large 实例(2 虚拟中央处理器,8GB 内存)\n# 最后更新:2024-03-01\n\n\n    ServerName api.example.com\n    DocumentRoot /var/www/html\n\n    # 安全套接层配置(强制使用传输层安全协议 1.2 及以上版本)\n    SSLEngine on\n    SSLCertificateFile /etc/ssl/certs/api.example.com.crt\n    SSLCertificateKeyFile /etc/ssl/private/api.example.com.key\n    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1\n    SSLCipherSuite HIGH:!aNULL:!MD5:!3DES\n\n    # 阿帕奇预派生多处理模块配置(阿帕奇 2.4 的默认配置)\n    \n        StartServers 5\n        MinSpareServers 5\n        MaxSpareServers 10\n        MaxRequestWorkers 150\n        MaxConnectionsPerChild 0\n    \n\n    # mod_proxy 反向代理设置\n    \n        ProxyRequests Off\n        ProxyPreserveHost On\n        ProxyVia Off\n\n        # 应用程序接口端点路由\n        \n            BalancerMember http://node1.internal:3000 retry=5\n            BalancerMember http://node2.internal:3000 retry=5\n            BalancerMember http://node3.internal:3000 retry=5\n            ProxySet lbmetho

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部