今天我们要聊聊的是一个非常酷的开源 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.target
sudo 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 \
caddy
Caddy 的使用非常简单,你只需要运行以下命令:
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 --overwrite
Caddy 提供了一个 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 @Caddyfile
Caddyfile 是 Caddy 的配置文件,它使用简单的语法来定义和配置 Caddy 的行为。以下是一些基本的 Caddyfile 配置:
:2015
respond "Hello, world!"
localhost
root * /var/www/mysite
file_server
localhost
root * /var/www/mysite
file_server browse
:2080
reverse_proxy :9000
your_domain.com:8443
reverse_proxy :9000
your_ip:8443
reverse_proxy :9000
{
auto_https disable_redirects
}
your_domain.com:8443
reverse_proxy :9000
localhost:2015 {
respond "Hello, world!"
}
localhost:2016 {
respond "Goodbye, world!"
}
localhost
reverse_proxy /api/* 127.0.0.1:9005
example.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 删除。