今天我们要聊聊的是一个非常酷的开源 HTTP/2 web 服务器——Caddy。Caddy 是用 Go 语言编写的,它的配置文件简洁明了,功能强大,使得 HTTP 服务的部署变得更加简单。Caddy 的最大特点是默认启用 HTTPS。在这篇文章中,我将向你介绍如何安装和使用 Caddy,以及如何通过 Caddyfile 和 API 来配置 Caddy。
Caddy 是一个开源的、使用 Go 编程语言构建的 HTTP/2 web 服务器,它的主要特性包括自动 HTTPS、HTTP/2、IPv6、Markdown、WebSockets、FastCGI、模板等。Caddy 的发展历史可以追溯到 2015 年,由 Matt Holt 在他的硕士论文中首次提出。他的目标是创建一个可以自动获取和更新 TLS 证书的 web 服务器,以便更容易地部署安全的网站。这个想法得到了广泛的认可,Caddy 很快就吸引了大量的开发者和用户。
sudo mv caddy /usr/bin/
sudo mkdir /etc/caddy
sudo cp Caddyfile /etc/caddy/Caddyfile
sudo groupadd --system caddy
sudo useradd --system \
--gid caddy \
--create-home \
--home-dir /var/lib/caddy \
--shell /usr/sbin/nologin \
--comment "Caddy web server" \
caddy/etc/systemd/system/caddy.service 文件:[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now caddy
sudo systemctl status caddy注意:如果你使用的是 CentOS 7,由于其 systemd 版本过低(219),需要先进行升级。
wget https://copr.fedorainfracloud.org/coprs/jsynacek/systemd-backports-for-centos-7/repo/epel-7/jsynacek-systemd-backports-for-centos-7-epel-7.repo -O /etc/yum.repos.d/jsynacek-systemd-centos-7.repo
sudo yum update systemd -y如果你更喜欢使用 Docker,你可以在 Docker Hub 上找到 Caddy 的官方镜像:https://hub.docker.com/_/caddy
你可以使用以下命令来运行一个 Caddy 容器:
docker run -d --name caddy \
-p 80:80 \
-v $PWD/Caddyfile:/etc/caddy/Caddyfile \
-v caddy_data:/data \
caddyCaddy 的使用非常简单,你只需要运行以下命令:
caddy run你也可以指定一个 Caddyfile:
caddy run --config /path/to/Caddyfile如果你需要启动一个静态文件服务器,你可以使用以下命令:
caddy file-server --listen :2015 --root ~/mysite如果你需要启动一个文件浏览器,你可以使用以下命令:
caddy file-server --browse如果你需要启动一个反向代理,你可以使用以下命令:
caddy reverse-proxy --from :2080 --to :9000如果你需要格式化你的 Caddyfile,你可以使用以下命令:
caddy fmt --overwriteCaddy 提供了一个 API 接口,你可以通过这个接口来查看和修改 Caddy 的配置。例如,你可以使用以下命令来查看当前的配置:
curl localhost:2019/config/你也可以添加一个新的 JSON 配置:
curl localhost:2019/load \
-H "Content-Type: application/json" \
-d @caddy.json或者更新一个现有的 Caddyfile:
curl localhost:2019/load \
-H "Content-Type: text/caddyfile" \
--data-binary @CaddyfileCaddyfile 是 Caddy 的配置文件,它使用简单的语法来定义和配置 Caddy 的行为。以下是一些基本的 Caddyfile 配置:
:2015
respond "Hello, world!"localhost
root * /var/www/mysite
file_serverlocalhost
root * /var/www/mysite
file_server browse:2080
reverse_proxy :9000your_domain.com:8443
reverse_proxy :9000your_ip:8443
reverse_proxy :9000{
auto_https disable_redirects
}
your_domain.com:8443
reverse_proxy :9000localhost:2015 {
respond "Hello, world!"
}
localhost:2016 {
respond "Goodbye, world!"
}localhost
reverse_proxy /api/* 127.0.0.1:9005example.com {
handle_path /foo/* {
# The path has the "/foo" prefix stripped
}
handle /bar/* {
# The path still retains "/bar"
}
}下面是一个使用 Caddy 的子路径代理功能来代理 n8n 服务的示例。首先,我们需要在 n8n 中添加 N8N_PATH 环境变量:
docker run -d \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
-e TZ="Asia/Shanghai" \
-e N8N_PATH=/n8n/ \
-e N8N_SECURE_COOKIE=false \
docker.n8n.io/n8nio/n8n然后,我们可以在 Caddy 中通过 handle_path 指令处理子路径请求并改写路径:
{
auto_https disable_redirects
}
9.135.143.173:8443 {
handle_path /n8n/* {
reverse_proxy localhost:5678
}
handle {
reverse_proxy localhost:8080
}
}这样,所有发送到 /n8n/* 的请求都会被代理到 localhost:5678,其他的请求则会被代理到 localhost:8080。
以上就是我对 Caddy 的介绍,包括它的安装、使用、API 和 Caddyfile。我希望这篇文章能帮助你更好地理解和使用 Caddy。如果你有任何问题或者建议,欢迎在评论区留言
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。