Nginx是一款非常流行的Web服务器,在Github上已有16K+Star,我们经常用它来做静态资源托管或反向代理。最近试用了一款全新的Web服务器Caddy,Star数超越Nginx,标星38K+Star。试用了一下Caddy,发现它使用起来比Nginx优雅多了,功能也很强大,分享一下。
Caddy 简介
Caddy是一个轻量级、高效的开源Web服务器,以其HTTP/2支持和自动HTTPS著名,具备简单配置和高性能等特性。与传统的服务器(如 Nginx)相比,Caddy 的配置通常更为简洁和易于使用,特别是对于初学者和小型项目非常友好。
它是一个 Go 编写的 Web 服务器,类似于 Nginx,Caddy 提供了更加强大的功能,随着 v2 版本发布,Caddy 已经可以作为中小型站点 Web 服务器的另一个选择。安装也很简单,可通过一键脚本或手动下载。Caddyfile用于配置主机、反向代理和自动HTTPS,使其成为易于管理和部署的,除Nginx外的新选择。
优点
- 自动 HTTPS:
- Caddy 默认支持自动获取和续期 SSL/TLS 证书,使用 Let’s Encrypt,无需手动配置证书,极大降低了安全配置的复杂度。
- 简洁易用的配置文件:
- Caddy 的配置文件(Caddyfile)语法简单,易于理解和使用,适合初学者快速上手。
- 内置文件服务器:
- Caddy 自带文件服务器功能,只需简单配置即可为静态文件提供服务。
- 现代化特性:
- Caddy 原生支持 HTTP/2 和 QUIC(HTTP/3),提高了网站的性能和加载速度。
- 插件支持:
- Caddy 提供丰富的插件体系,允许用户通过插件扩展功能,如反向代理、路由等。
- 高性能:
- 尽管配置简单,但 Caddy 在处理静态内容和小型应用时表现良好,具有高性能的特性。
Caddy 的默认端口
Caddy 默认监听的端口如下:
- HTTP: 80
- HTTPS: 443
在使用 Caddy 时,它会自动为域名申请和管理 SSL/TLS 证书,使用 Let’s Encrypt 进行免费证书的自动获取和续期。
Caddy 的安装与基本使用
1. 安装 Caddy
您可以通过以下方式之一安装 Caddy:
- 使用包管理器(例如,
apt
、brew
等)进行安装。 - 直接下载二进制文件。
- 使用 Docker。
以下是使用 apt
安装 Caddy 的示例(适用于 Debian/Ubuntu):
sudo apt update
sudo apt install -y debian-keyring debian-archive-keyring
echo "deb [signed-by=/usr/share/keyrings/caddy-archive-keyring.gpg] https://dl.caddyserver.com/debian/ caddy main" | sudo tee /etc/apt/sources.list.d/caddy.list
curl -s https://dl.caddyserver.com/debian/caddy.gpg | sudo gpg --dearmor --output /usr/share/keyrings/caddy-archive-keyring.gpg
sudo apt update
sudo apt install caddy
如果是 Redhat 或者是 CentOS 的话,则可以使用如下命令安装:
yum install yum-plugin-copr
yum copr enable @caddy/caddy
yum install caddy
2. 配置 Caddy
Caddy 的默认配置文件位置通常是 /etc/caddy/Caddyfile
。
以下是一个简单的示例 Caddyfile
:
example.com {
root * /var/www/html
file_server
}
这个配置的意思是,Caddy 会在 example.com
域名下提供 /var/www/html
目录里的静态文件,并启用文件服务器。
Caddy 的配置文件可以是 JSON 格式或 Caddyfile 格式。
Caddyfile 是一种更加简洁的文本配置格式,适合快速配置常见的用例。
下面我将重点介绍 Caddyfile 的配置方式。
Caddyfile 基础语法
Caddyfile 使用简单的文本格式,每一行可以包含一个服务器块,其中包含域名、TLS 设置和其他指令。服务器块以域名开始,后面跟着一系列的指令。
一个典型的 Caddyfile 服务器块如下所示:
javaboy.org {
# 配置指令
}
常见指令
这里有一些常用的指令:
- root: 指定网站的根目录。
- tls: 用于自动获取和管理 TLS/SSL 证书。
- proxy: 用于配置反向代理。
- rewrite:用于重写 URL。
- gzip: 开启 GZIP 压缩。
- auth: 配置基本的身份验证。
- cache: 配置缓存设置。
- log:配置日志输出。
示例配置
下面是一个简单的 Caddyfile 示例,该示例配置了一个网站,并自动为该网站启用 HTTPS:
javaboy.org {
root /var/www/html
tls admin@javaboy.org
gzip
log /var/log/caddy/access.log combined
# 反向代理到后端服务
proxy / localhost:8080 {
websocket
transparent
}
# 基本身份验证
auth /admin user:password
}
解释
- javaboy.org: 域名,可以是多个域名,用空格隔开。
- root /var/www/html: 指定网站内容所在的目录。
- tls admin@example.com: 为域名自动配置 TLS 证书,并指定用于接收证书通知的电子邮件地址。
- gzip: 启用 GZIP压缩。
- log /var/log/caddy/access.log combined: 将访问日志记录到指定的文件中。
- proxy /localhost:8080: 将所有请求代理到本地的 8080 端口。websocket 和 transparent 分别表示支持WebSocket 协议和透明代理。
- auth /admin user:password: 对 /admin 路径下的资源启用基本的身份验证。
多个服务器配置
Caddyfile 支持在同一文件中配置多个服务器:
javaboy.org {
# javaboy.org 的配置
}
sub.javaboy.org {
# sub.javaboy.org 的配置
}
3. 启动 Caddy
Caddy 通常作为系统服务运行,可以使用如下命令启动:
sudo systemctl start caddy
sudo systemctl enable caddy # 设置为开机自启
常见用法
部署静态网页
http://yousite.com {
encode gzip # gzip压缩
root * /var/web/wwwroot # web根目录
file_server browse # 启动静态资源
}
部署 File_server
yousite.com {
root * /var/share #根目录
file_server browse #启动web文件服务
}
反向代理
yousite.com {
reverse_proxy localhost:8082 #反向代理
}
其他
caddy adapt ## 加载配置文件
caddy fmt ## 格式化配置
caddy start ## 启动服务
caddy reload ## 重新部署
简单使用举例
安装完成后,修改:/etc/caddy/Caddyfile文件:
# The Caddyfile is an easy way to configure your Caddy web server.
#
# https://caddyserver.com/docs/caddyfile
# The configuration below serves a welcome page over HTTP on port 80. To use
# your own domain name with automatic HTTPS, ensure your A/AAAA DNS record is
# pointing to this machine's public IP, then replace `http://` with your domain
# name. Refer to the documentation for full instructions on the address
# specification.
#
# https://caddyserver.com/docs/caddyfile/concepts#addresses
http://:8000 {
# Set this path to your site's directory.
root * /root/caddy
# Enable the static file server.
file_server
# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000
# Refer to the directive documentation for more options.
# https://caddyserver.com/docs/caddyfile/directives
}
# As an alternative to editing the above site block, you can add your own site
# block files in the Caddyfile.d directory, and they will be included as long
# as they use the .caddyfile extension.
import Caddyfile.d/*.caddyfile
注意这上面的:8000 是我加上去的。因为不加的话默认它是80端口。
然后,启动起来即可:
#停止
caddy stop
#后台启动
caddy start
#直接运行,注意需要指定 --config /etc/caddy/Caddyfile,否则只会启动api,默认api在2019端口
caddy run --config /etc/caddy/Caddyfile
Caddy vs Nginx
特性 | Caddy | Nginx |
---|---|---|
配置方式 | 使用 Caddyfile,配置简洁易懂 | 使用 nginx.conf,配置项较多 |
HTTPS 自动化 | 支持自动获取和续期 SSL/TLS 证书 | 需要手动配置证书 |
性能 | 对静态文件和小型应用优化良好 | 性能极高,适用于大规模并发连接 |
安装 | 简单,单个二进制文件 | 安装过程相对复杂 |
模块 | 提供多个内置模块,支持插件扩展 | 模块化设计,但需要手动编译 |
结论
Caddy 是一款适合快速部署和简单配置的现代 Web 服务器,对于初学者和小型项目推荐使用。而 Nginx 则适合需要高性能和高并发处理的场景,特别是在配置需要细致调节的情况下。
Caddy 内置了丰富的插件,例如内置 “file_server”、内置各种负载均衡策略等,这些插件组合在一起可以实现一些复杂的功能;Caddy 是采用 go 编写的,官方也给出了详细的开发文档,相较于 Nginx 来说,Caddy 的插件开发上手要容易得多;Caddy 本身针对数据存储、动态后端、配置文件转换等都内置了扩展接口,这为有特定需求的扩展开发打下了良好基础。
根据项目需求选择适合的服务器,Caddy 适用于简单的静态网站,而 Nginx 在处理复杂的负载均衡和动态内容时效果更佳。
其他资源
从简单到强大:再次探索Caddy服务器的魅力
一个比 Nginx 还简单的 Web 服务器
超越 Nginx!号称下一代 Web 服务器,用起来够优雅!