性能比拼: Nginx vs Caddy

news2025/5/10 8:17:00

本内容是对知名性能评测博主 Anton Putra Nginx vs Caddy Performance 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准

引言

在本期视频中,我们将对比 Nginx 和 Caddy---一个用 Go 编写的 Web 服务器和反向代理。

在第一个测试中,我们会使用 Nginx 和 Caddy 通过 HTTPS 提供静态网站服务,并在两个服务器上启用默认压缩。我们重点关注的是延迟,使用 p99 百分位进行衡量。吞吐量方面,我们会查看每个 Web 服务器可以处理的请求数。为评估资源饱和度,我们将监控 CPU 与内存相对于整台虚拟机的使用情况,以及网络流量。最后,我们还会测量每个 Web 服务器的错误率可用性

在第二个测试中,我们会将 Nginx 和 Caddy 用作反向代理和负载均衡器,将流量分发给后端应用。此外,我们也会统计这些应用的 CPU 和内存使用情况。

我使用 AWS 来运行所有测试,并根据不同的工作负载选择最新的 EC2 实例。例如,在这个视频中,我为 Web 服务器配置了 m7a.large 实例,后端应用使用同样的 EC2 类型。我还设置了一个由 Graviton 实例组成的 EKS 集群,用来运行客户端并生成负载。同时使用 Route 53 创建私有托管区域,用于服务发现。每次基准测试运行数小时,通常每次测试的花费在 20 到 50 美元之间。


测试设计

我使用 Terraform 创建 VPC 及测试所需的所有网络组件。

在第一个测试中,我使用基于 React 的 JavaScript 框架 Next.js 来生成一个简单的网站,并将其编译为 HTML、CSS 和 JavaScript 文件。然后我为每个 Web 服务器创建一个大型 EC2 实例(2 个 CPU 和 8 GB 内存),并将网站上传至每台服务器。同时,我创建了一个自签名的证书颁发机构,并为 Nginx 和 Caddy 签发证书。

为生成负载,我创建一个 EKS 集群,并使用 Kubernetes job 为每台 Web 服务器部署约 20 个 pod。为每个客户端提供证书以认证访问 Web 服务器。这种设置很常见:两个服务器都使用压缩服务静态内容,并通过 HTTPS 提供安全传输。TLS 证书还允许我们从 HTTP/1 升级到更高效的二进制协议 HTTP/2。

在第二个测试中,我为每台服务器配置了两个额外的 EC2 实例,作为后端应用,实例类型与前面相同。此测试中,每台服务器被配置为反向代理和负载均衡器,将流量分发到后端应用。由于负载较小,此测试未启用压缩。每个应用向客户端返回硬编码数据。此外,我配置了代理传递原始客户端 IP 地址,使用的是 X-Forwarded-For 头。

当反向代理接收到来自客户端的请求时,会终止该请求,并以自身 IP 作为源地址,向应用发起新的请求。如果你的应用需要获取客户端的真实 IP,可以使用 X-Forwarded-For 头或配置 proxy protocol。


配置概览

在之前与 Apache 的测试中,我主要使用 Nginx 的默认设置,这些设置已经很高效。但我收到 Melroy 的一个 Pull Request,包含了一些优化建议,于是在这次测试中应用了它们。我还做了一些额外的配置更改,并测试了不同的线程设置。

这些更改对第一个测试影响不大,但在第二个测试中显著提升了 Nginx 作为反向代理和负载均衡器的性能。配置中还包括 multi_accept 设置,并且我提高了系统允许打开的文件数限制。

在网站配置中,我只使用了 443 端口用于 HTTPS,并提供了我本地生成的证书和私钥。第二个测试中,我声明了一个上游服务,并使用默认的轮询算法将流量分发给后端应用。我也添加了 X-Forwarded-For 头,大致就是这些配置。源代码可在我的公共 GitHub 仓库中找到,链接会在视频描述中提供。

在之前的测试中,我使用的是最新稳定版本 1.26.2。这次测试使用的是主线分支的最新版本 1.27.2。

另一方面,我们来看 Caddy。据我所知,Caddy 最大的卖点是简单易用。如果你不想花时间配置 Nginx,可以选择 Caddy,它几乎能完成 Nginx 所能做的一切,但只需最少配置。这个 Web 服务器对初学者也很友好。根据官方文档,一个非常简单的配置就可以用于生产环境。

因此,我在测试中故意使用了默认的“生产”设置。

我为 Caddy 编译并使用了相同的网站,也启用了压缩。我提供了自己的证书和私钥,并使用 file_server 指令来提供网站服务。默认情况下,Caddy 的访问日志非常详细,为了公平比较,我使用了类似 Nginx 和 Apache 的日志格式,以减少文件系统负载。第二个测试中,我同样使用了最小配置,使用 reverse_proxy 设置。

所以从功能上看,这两个服务器都使用压缩和 HTTP/2 协议,并通过 HTTPS 提供服务。Caddy 使用的版本是 2.8.4。


第一个测试:Web 服务器

现在让我们开始第一个测试。对我来说,延迟和吞吐量是最重要的指标,当然还有可用性。

测试开始时,Nginx 在提供静态网站时延迟明显更低。从 CPU 使用率来看,你可以预测哪个 Web 服务器更容易先失败。内存使用方面,两者非常接近,约占 8GB 总内存的 6%。你还会注意到,Nginx 传输的网络数据稍多一些,主要是因为它的压缩级别略低。

在每秒约 4,000 个请求时,Caddy 的 CPU 使用率达到了 50%,从那时开始延迟开始上升。至于每个请求的“有效延迟”标准,需要根据你的使用场景和预期定义。在这个测试中,我使用的是 1 秒超时,超时后返回 408 状态码,这会影响服务的可用性。

当请求达到每秒约 8,000 个时,Caddy 在每秒请求数方面开始落后于 Nginx。此时出现了显著的延迟峰值,我怀疑这可能是 Go 的垃圾回收导致的,但也可能是别的原因。如果你有不同看法,欢迎告诉我。

在每秒约 10,000 个请求时,Caddy 的 CPU 使用率接近 100%,性能进一步下降。

本次测试中,Nginx 和 Caddy 部署在独立的虚拟机上,因此不存在 CPU 限流的问题。现在我们来看看优化后的 Nginx 最多能处理多少请求。虽然花了点时间,但最终 Nginx 达到了接近每秒 22,000 个请求,与之前 Apache 视频中的结果几乎一致,不过这次表现更加稳定。在上次测试中,Nginx 在达到 80% CPU 使用率后立即崩溃,而这次即使达到相同请求数仍能继续运行。

现在我们打开每张图表,查看整个测试持续时间。整个测试持续了大约 2 小时。

首先是每秒请求数图表---在 8,000 请求/秒时 Caddy 开始性能下降,最高约 10,000 请求/秒;而 Nginx 处理了超过两倍的请求,达到 22,000 请求/秒。

接着是 p99 延迟图表。Caddy 开始性能下降后延迟上升明显,但从测试一开始,Nginx 的延迟就更稳定,显著低于 Caddy。对于面向客户端的应用来说,低延迟能够提供更好的用户体验。

然后是两个 Web 服务器的 CPU 使用情况。Web 服务器是典型的 CPU 密集型应用,因此 CPU 使用率越低,通常意味着更好的响应速度和更高吞吐量。

接下来是内存使用图表。虽然有几次波动,但始终在 6% 到 8% 之间。因此,在这个测试中,内存并不是性能瓶颈。

然后是可用性图表。你可以看到测试后期错误率略有上升,但比例极小---每秒几千个请求中只有 1~2 个错误。你可能会好奇为什么 Caddy 没有错误?这是因为 Nginx 会尝试处理所有请求,而 Caddy 在过载时会拒绝新请求,因此不会产生超时错误。

最后是网络流量图表。在峰值时,Nginx 的吞吐量接近每秒 600MB,而 Caddy 只有一半不到。

如果你是初学者或 Web 开发者,不想花太多时间优化 Web 服务器,Caddy 是个不错的选择。如果你担心 TLS 证书管理,Caddy 也非常适合。但从性能来看,Nginx 明显更强,可以大幅降低运行成本。我估算使用 Nginx 可节省近一半的基础设施费用。最终选择权在你手中,如果是个人项目或少量用户,Caddy 完全能胜任。


第二个测试:反向代理

我们继续进行第二个测试。在这个测试中,我们将每个服务器作为反向代理和负载均衡器使用。

最初我很高兴看到 Caddy 表现优于 Nginx,但这种优势很快就消失了。当请求达到每秒 900 次,CPU 使用率仅为 12% 时,Caddy 的延迟就开始上升。相比之下,Nginx 的延迟保持平稳。

这个测试中让我最惊讶的是:为什么 Nginx 后端的应用承受了比其他代理更大的负载?之前 Apache 的测试中也出现了类似情况。如果你对此有见解,请告诉我。

这个测试中,Nginx 的内存使用稍高于 Caddy,但对于这种 CPU 密集型应用,内存影响不大。

当请求达到每秒约 10,000 次时,Caddy 出现了与上次类似的延迟问题。我怀疑也是垃圾回收引起的,但欢迎你提供其他想法。

当请求达到每秒 14,000 次时,Caddy 的 CPU 使用率几乎达到 100%,无法处理更多请求,延迟也开始明显上升。接下来我们看看 Nginx 能处理多少请求。

整个测试持续近 3 小时,Nginx 最终达到了近 27,000 请求/秒的吞吐量,比 Apache 测试中的结果还高。可见,如果打算将 Nginx 用作反向代理,务必要进行优化,而不是依赖默认配置。

我们接着查看每个图表:

  • 吞吐量:Caddy 最多处理约 14,000 请求/秒,而 Nginx 达到约 27,000 请求/秒。

  • 延迟图表:测试初期 Caddy 表现稍好,但很快失去优势。

  • CPU 使用情况

  • 内存使用情况

  • 可用性图表:Caddy 的可用性在某些阶段甚至降至 42%,而 Nginx 几乎保持在 99.99%。

  • 网络流量图表

  • 反向代理后应用的 CPU 使用情况:Nginx 后的应用 CPU 使用率异常高,请告诉我你对此的看法。

  • 反向代理后应用的内存使用情况

结论:我认为 Caddy 是非常适合 Web 开发者或初学者的 Web 服务器。但如果你开始搭建负载均衡和反向代理,说明你已经有一定流量,应开始考虑架构优化并深入学习 Web 服务器和代理。此时,Nginx 提供更高吞吐量和更低延迟,运行成本更低。因此,与其使用 Caddy,不如选择 Nginx 或其他更高效的代理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++项目-衡码云判项目演示

衡码云判项目是什么呢?简单来说就是这是一个类似于牛客、力扣等在线OJ系统,用户在网页编写代码,点击提交后传递给后端云服务器,云服务器将用户的代码和测试用例进行合并编译,返回结果到网页。 项目最大的两个亮点&…

李宏毅NLP-6-seq2seqHMM

比较seq2seq和HMM Hidden Markov Model(HMM) 隐马尔可夫模型(HMM)在语音识别中的应用,具体内容如下: 整体流程: 左侧为语音信号(标记为 “speech”),其特征表示为 X X X。中间蓝色模…

百度暑期实习岗位超3000个,AI相关岗位占比87%,近屿智能携AIGC课程加速人才输出

今年3月,百度重磅发布3000暑期实习岗位,聚焦大模型、机器学习、自动驾驶等AI方向的岗位比例高达87%。此次实习岗位涉及技术研发、产品策划、专业服务、管理支持、政企解决方案等四大类别,覆盖超300个岗位细分方向。值得一提的是,百…

【技术派后端篇】基于 Redis 实现网站 PV/UV 数据统计

在网站的数据分析中,PV(Page View,页面浏览量)和 UV(Unique Visitor,独立访客数)是两个重要的指标,几乎每个网站都需要对其进行统计。市面上有很多成熟的统计产品,例如百…

JAVA:利用 Apache Tika 提取文件内容的技术指南

1、简述 Apache Tika 是一个强大的工具,用于从各种文件中提取内容和元数据。📄Tika 支持解析文档、📸图像、🎵音频、🎥视频文件以及其他多种格式,非常适合构建🔍搜索引擎、📂内容管理系统和📊数据分析工具。 样例代码:https://gitee.com/lhdxhl/springboot-…

【AI】SpringAI 第二弹:接入 DeepSeek 官方服务

一、接入 DeepSeek 官方服务 通过一个简单的案例演示接入 DeepSeek 实现简单的问答功能 1.添加依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency> 2…

XMLXXE 安全无回显方案OOB 盲注DTD 外部实体黑白盒挖掘

# 详细点&#xff1a; XML 被设计为传输和存储数据&#xff0c; XML 文档结构包括 XML 声明、 DTD 文档类型定义&#xff08;可 选&#xff09;、文档元素&#xff0c;其焦点是数据的内容&#xff0c;其把数据从 HTML 分离&#xff0c;是独立于软件和硬件的 信息传输…

SQL之DML(查询语句:select、where)

&#x1f3af; 本文专栏&#xff1a;MySQL深入浅出 &#x1f680; 作者主页&#xff1a;小度爱学习 select查询语句 在开发中&#xff0c;查询语句是使用最多&#xff0c;也是CRUD中&#xff0c;复杂度最高的sql语句。 查询的语法结构 select *|字段1 [, 字段2 ……] from 表…

Oracle--用户管理

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 用户管理在 Oracle 数据库中至关重要。一个服务器通常只运行一个 Oracle 实例&#xff0c;而一个 Oracle 用户代表一个用户群&#xff0c;他们通过该用…

git忽略已跟踪的文件/指定文件

在项目开发中&#xff0c;有时候我们并不需要git跟踪所有文件&#xff0c;而是需要忽略掉某些指定的文件或文件夹&#xff0c;怎么操作呢&#xff1f;我们分两种情况讨论&#xff1a; 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…

RAG(检索增强生成)、ReAct(推理与行动) 和 多模态AI 的详细解析,包括三者的定义、工作原理、应用场景及协同关系

以下是 RAG&#xff08;检索增强生成&#xff09;、ReAct&#xff08;推理与行动&#xff09; 和 多模态AI 的详细解析&#xff0c;包括三者的定义、工作原理、应用场景及协同关系&#xff1a; 一、RAG&#xff08;Retrieval-Augmented Generation&#xff09; 1. 核心原理 …

6.QT-常用控件-QWidget|windowTitle|windowIcon|qrc机制|windowOpacity|cursor(C++)

windowTitle API说明windowTitle()获取到控件的窗⼝标题.setWindowTitle(const QString& title)设置控件的窗⼝标题. 注意!上述设置操作针对不同的widget可能会有不同的⾏为. 如果是顶层widget(独⽴窗⼝),这个操作才会有效. 如果是⼦widget,这个操作⽆任何效果. 代码⽰例…

Excel/WPS表格中图片链接转换成对应的实际图片

Excel 超链图变助手&#xff08;点击下载可免费试用&#xff09; 是一款将链接转换成实际图片&#xff0c;批量下载表格中所有图片的转换工具&#xff0c;无需安装&#xff0c;双击打开即可使用。 表格中链接如下图所示&#xff1a; 操作方法&#xff1a; 1、双击以下图标&a…

PostgreSQL基础

一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议&#xff0c;这个协议基本和MIT开源协议一样&#xff0c;说人话&#xff0c;就是你可以对PostgreSQL进行一些封装&a…

win11修改文件后缀名

一、问题描述 win11系统中&#xff0c;直接添加.py后缀后仍然是txt文本文件 二、处理方式&#xff1a; 点击上方三个小点点击“选项”按钮 点击“查看”取消“隐藏已知文件类型的扩展名”选项点击“应用” 此时&#xff0c;“.txt”文件后缀显示出来了。将txt删去&#xff0c…

Navicat连接数据库密码忘了如何解析

1、首先打开Navicat导出密码 打开文件---》导出链接----》选择连接并勾选导出密码 2、用编辑器打开复制密码 把password后面的密码复制出来 3、打开php编辑器&#xff0c;我这边因为平时不用就在网上找了一个在线编辑器 地址: https://www.w3cschool.cn/tryrun/runcode?la…

OpenStack Yoga版安装笔记(22)Swift笔记20250418

一、官方文档 https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html#https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html# 二、对象存储简介&#xff08;Introduction to Object Storage&#xff09; OpenStack 对象存储&a…

18、TimeDiff论文笔记

TimeDiff **1. 背景与动机****2. 扩散模型基础****3. TimeDiff 模型****3.1 前向扩散过程****3.2 后向去噪过程** 4、TimeDiff&#xff08;架构&#xff09;原理训练推理其他关键点解释 DDPM&#xff08;相关数学&#xff09;1、正态分布2、条件概率1. **与多个条件相关**&…

Linux环境下使用ADB命令做嵌入式开发

介绍 adb一般是给Android开发用的&#xff0c;但是换个思路也能做嵌入式Linux开发 安装 以Ubuntu20.04为例 sudo apt install android-tools-adb android-tools-fastboot安装成功可以查看adb版本号 命令 查看adb设备 登录shell 上传文件到设备指定目录 拉取设备上的文件到…

深度学习方向急出成果,是先广泛调研还是边做实验边优化?

目录 有限资源下本科生快速发表深度学习顶会论文的实战策略 1.短周期内可出成果的研究路径 2.论文阅读与复现的优先顺序 3.无一对一指导时的调研与实验组织 4.成功案例&#xff1a;本科生顶会论文经验 5.快速上手的研究子方向推荐 大家好这里是AIWritePaper官方账号&…