性能比拼: Nginx vs Caddy
本内容是对知名性能评测博主 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 或其他更高效的代理。
相关文章:
性能比拼: Nginx vs Caddy
本内容是对知名性能评测博主 Anton Putra Nginx vs Caddy Performance 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 引言 在本期视频中,我们将对比 Nginx 和 Caddy---一个用 Go 编写的 Web 服务器和反向代理。 在第一个测试中,我们会使用…...
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 外部实体黑白盒挖掘
# 详细点: XML 被设计为传输和存储数据, XML 文档结构包括 XML 声明、 DTD 文档类型定义(可 选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的 信息传输…...
SQL之DML(查询语句:select、where)
🎯 本文专栏:MySQL深入浅出 🚀 作者主页:小度爱学习 select查询语句 在开发中,查询语句是使用最多,也是CRUD中,复杂度最高的sql语句。 查询的语法结构 select *|字段1 [, 字段2 ……] from 表…...
Oracle--用户管理
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 用户管理在 Oracle 数据库中至关重要。一个服务器通常只运行一个 Oracle 实例,而一个 Oracle 用户代表一个用户群,他们通过该用…...
MYDB仿MySQL手写数据库项目总结
声明:该项目是一个开源项目,我是在学习该项目,该项目的github地址如下: MYDB项目地址:https://github.com/CN-GuoZiyang/MYDB MYDB项目采用C/S结构,支持启动一个服务器,并有多个客户端去连接…...
24.中医知识问答删除历史对话功能前端代码实现
前端实现对话删除功能的完整指南 功能概述 前篇文章介绍了删除历史对话的后端开发,本篇将介绍如何在前端实现一个完整的对话删除功能,包括用户确认、API调用、状态管理和错误处理等关键环节。 功能拆解 1. 用户确认机制 javascript const confirmDe…...
git忽略已跟踪的文件/指定文件
在项目开发中,有时候我们并不需要git跟踪所有文件,而是需要忽略掉某些指定的文件或文件夹,怎么操作呢?我们分两种情况讨论: 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…...
RAG(检索增强生成)、ReAct(推理与行动) 和 多模态AI 的详细解析,包括三者的定义、工作原理、应用场景及协同关系
以下是 RAG(检索增强生成)、ReAct(推理与行动) 和 多模态AI 的详细解析,包括三者的定义、工作原理、应用场景及协同关系: 一、RAG(Retrieval-Augmented Generation) 1. 核心原理 …...
6.QT-常用控件-QWidget|windowTitle|windowIcon|qrc机制|windowOpacity|cursor(C++)
windowTitle API说明windowTitle()获取到控件的窗⼝标题.setWindowTitle(const QString& title)设置控件的窗⼝标题. 注意!上述设置操作针对不同的widget可能会有不同的⾏为. 如果是顶层widget(独⽴窗⼝),这个操作才会有效. 如果是⼦widget,这个操作⽆任何效果. 代码⽰例…...
Excel/WPS表格中图片链接转换成对应的实际图片
Excel 超链图变助手(点击下载可免费试用) 是一款将链接转换成实际图片,批量下载表格中所有图片的转换工具,无需安装,双击打开即可使用。 表格中链接如下图所示: 操作方法: 1、双击以下图标&a…...
PostgreSQL基础
一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议,这个协议基本和MIT开源协议一样,说人话,就是你可以对PostgreSQL进行一些封装&a…...
win11修改文件后缀名
一、问题描述 win11系统中,直接添加.py后缀后仍然是txt文本文件 二、处理方式: 点击上方三个小点点击“选项”按钮 点击“查看”取消“隐藏已知文件类型的扩展名”选项点击“应用” 此时,“.txt”文件后缀显示出来了。将txt删去,…...
【python实用小脚本系列】用Python打造你的专属智能语音助手
用Python打造你的专属智能语音助手 在科技飞速发展的今天,语音助手已经成为了我们生活中的“小帮手”。无论是苹果的Siri,还是亚马逊的Alexa,它们都能通过语音指令帮我们完成各种任务。今天,我来给大家分享一个用Python打造的简单…...
《Java工程师面试核心突破》专栏简介
《Java工程师面试核心突破》专栏简介 🔥 大厂Offer收割机 | 源码级技术纵深 | 90%高频考点覆盖 专栏定位 「拒绝八股文,直击技术本质」 本专栏专为Java中高级工程师量身定制,通过6大核心模块、30个硬核专题,系统性拆解大厂面试…...
Navicat连接数据库密码忘了如何解析
1、首先打开Navicat导出密码 打开文件---》导出链接----》选择连接并勾选导出密码 2、用编辑器打开复制密码 把password后面的密码复制出来 3、打开php编辑器,我这边因为平时不用就在网上找了一个在线编辑器 地址: 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# 二、对象存储简介(Introduction to Object Storage) OpenStack 对象存储&a…...
基于若依的ruoyi-vue-plus的nbmade-boot在线表单的设计(七)后端方面的设计
希望大家一起能参与我的新开源项目nbmade-boot: 宁波智能制造低代码实训平台 主要目标是类似设计jeecgboot那样的online表单功能,因为online本身没有开源这部分代码,而我设计这个是完全开源的,所以希望大家支持支持,开源不容易。 今天主要是讲后端部门之前漏的文件。 下面主…...
18、TimeDiff论文笔记
TimeDiff **1. 背景与动机****2. 扩散模型基础****3. TimeDiff 模型****3.1 前向扩散过程****3.2 后向去噪过程** 4、TimeDiff(架构)原理训练推理其他关键点解释 DDPM(相关数学)1、正态分布2、条件概率1. **与多个条件相关**&…...
【Rust 精进之路之第11篇-借用·实践】切片 (Slices):安全、高效地引用集合的一部分
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:不止整个借用,我们还能“借”片段! 在上一篇【借用规则】中,我们深入理解了 Rust 的引用 (&T, &mut T) 和借用规则。我们知道,引用允许我们在不获取所有权的情…...
Linux环境下使用ADB命令做嵌入式开发
介绍 adb一般是给Android开发用的,但是换个思路也能做嵌入式Linux开发 安装 以Ubuntu20.04为例 sudo apt install android-tools-adb android-tools-fastboot安装成功可以查看adb版本号 命令 查看adb设备 登录shell 上传文件到设备指定目录 拉取设备上的文件到…...
Ubuntu20.04安装Pangolin遇到的几种报错的解决方案
1.添加两个编译选项 /usr/include/OpenEXR/half.h:121:13: note: because ‘half’ has user-provided ‘half& half::operator(half)’121 | half & operator (half h);| ^~~~~~~~ 解决方案: 在CMakeList中添加以下两句: …...
SQL问题分析与诊断(8)——分析方法2
8.4. 方法 8.4.2. 目测评估方法 8.4.2.1. 方法说明 与Oracle等其他关系库类似,SQL Server中,作为其最核心、最重要的组件之一,CBO内置了相当复杂而高级的模型和算法,当将SQL语句及其相关统计数据等信息作为参数输入其中后,CBO会对该SQL语句各候选查询计划及其中各节点的…...
自动驾驶最新算法进展
自动驾驶技术的算法进展迅速,涵盖感知、预测、规划、端到端学习等多个领域。以下是2023年至2024年的关键进展及实例: 1. 感知与融合 BEVTransformer的进化:特斯拉的Occupancy Networks升级至支持动态场景建模,结合NeRF技术…...
深度学习方向急出成果,是先广泛调研还是边做实验边优化?
目录 有限资源下本科生快速发表深度学习顶会论文的实战策略 1.短周期内可出成果的研究路径 2.论文阅读与复现的优先顺序 3.无一对一指导时的调研与实验组织 4.成功案例:本科生顶会论文经验 5.快速上手的研究子方向推荐 大家好这里是AIWritePaper官方账号&…...
