--- title: "Debian / Ubuntu 安装 Caddy" tags: ['Debian', 'Ubuntu', 'Caddy', 'Caddy Server'] published: 2022-12-27 04:47:25 updated: 2022-12-27 00:00:00 excerpt: "本文将指导如何在 Debian 和 Ubuntu 下安装 Caddy。" --- > 本文件是烧饼博客文章的 Markdown 原文,正式版本见 https://u.sb/debian-install-caddy/ > 全站文章与页面索引见 https://u.sb/llms.txt,建议先读索引再继续抓取。 本文将指导如何在 Debian 和 Ubuntu 下安装 Caddy。 以下操作需要 root 权限,本文命令均已带上 `sudo` 前缀,请确保当前用户拥有 `sudo` 权限;或者直接使用 root 用户操作并省略命令中的 `sudo`。 ## 什么是 Caddy? [Caddy](https://caddyserver.com/) 是一款开源的 Web 服务器,它设计简单,易于使用,并且有很多强大的功能。它可以自动处理 TLS (SSL),并且可以使用中间件扩展功能。 Caddy 采用简单的配置语法,可以轻松配置路由,反向代理,重定向,缓存和其他功能。它还支持 HTTP/2,QUIC (HTTP/3) 和 WebSockets 协议,可以提供快速的网络性能。 ## 为什么尝试 Caddy? 对我来说比较简单的原因是 [nginx-quic](https://quic.nginx.org/) 这个项目一直未发布正式版,想要一款简单的能支持 [HTTP/3](https://en.wikipedia.org/wiki/HTTP/3) 的 Web 服务器软件,目前来说 Caddy 的选择是最合适的。 Caddy 还支持自动化证书,对于懒人来说特别合适。 ## 安装 Caddy 我们按照官方的[安装方法](https://caddyserver.com/docs/install#debian-ubuntu-raspbian),首先,安装一些必要的软件包: ```bash sudo apt update sudo apt upgrade -y sudo apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates ``` 然后加入 Caddy 的 GPG 公钥和 apt 源: ```bash curl -sSL https://dl.cloudsmith.io/public/caddy/stable/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/caddy.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/caddy.gpg] https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main" | sudo tee /etc/apt/sources.list.d/caddy.list ``` Debian 下也可以使用 extrepo: ```bash sudo apt install extrepo sudo extrepo enable caddyserver ``` 然后更新系统后即可安装 Caddy: ```bash sudo apt update sudo apt install caddy ``` ## 配置 Caddy 默认的 `Caddyfile` 文件位于 `/etc/caddy/Caddyfile`,官方的教程在[这儿](https://caddyserver.com/docs/caddyfile-tutorial),如果你习惯了 Nginx 和 Apache 的配置,那么此时应该会非常不习惯,我们就来一个最简单的例子把: 1. 我们需要绑定域名 `example.com` 2. 这个域名的文件位于 `/var/www/example.com`,默认首页文件名为 `index.html` 3. 我们需要开启 SSL 访问,并且访问 http 跳转到 https 4. 我们需要设置开启 TLS 1.2 和 TLS 1.3,并开启 HSTS Preload 首先,设置 `http://example.com/` 跳转到 `https://example.com/`: **注意**:默认情况如果下面的 `example.com:80` 和 `example.com:443` 没有配置其他的端口,Caddy 会自动使用 443 端口,并自动开启 `http://example.com/` 跳转到 `https://example.com/`,这里的示范是为了给有些奇怪的需求比如一些特定的端口访问 HTTP 和 HTTPS,则需要手动配置。 ```bash example.com:80 { redir https://{host}{uri} permanent } ``` 然后我们按照 Mozilla 的[推荐配置](https://ssl-config.mozilla.org/#server=caddy&version=2.6.2&config=intermediate&guideline=5.6)写入 `Caddyfile`: ```bash example.com:443 { tls { protocols tls1.2 tls1.3 ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 } header { Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Referrer-Policy strict-origin-when-cross-origin X-Frame-Options SAMEORIGIN X-Content-Type-Options nosniff X-XSS-Protection "1; mode=block" } root * /var/www/example.com file_server { index index.html } encode gzip zstd } ``` 当然也可以设置 `www.example.com` 跳转 `example.com`: ```bash www.example.com:80 { redir https://example.com{uri} permanent } www.example.com:443 { redir https://example.com{uri} permanent } ``` 然后把以上所有内容合并成一个 `Caddyfile` 文件,放到 `/etc/caddy/Caddyfile`,然后检查 Caddy 配置: ```bash sudo caddy validate --config /etc/caddy/Caddyfile ``` 输出如下内容则表示配置正确: ```bash root@debian ~ # caddy validate --config /etc/caddy/Caddyfile 2022/12/26 17:31:22.347 INFO using provided configuration {"config_file": "/etc/caddy/Caddyfile", "config_adapter": ""} 2022/12/26 17:31:22.349 WARN http server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server {"server_name": "srv1", "http_port": 80} 2022/12/26 17:31:22.349 INFO http enabling automatic HTTP->HTTPS redirects {"server_name": "srv0"} 2022/12/26 17:31:22.349 INFO tls.cache.maintenance started background certificate maintenance {"cache": "0xc00018ad90"} 2022/12/26 17:31:22.350 INFO tls.cache.maintenance stopped background certificate maintenance {"cache": "0xc00018ad90"} Valid configuration ``` 有强迫症的也可以把你的 Caddyfile 文件美化一下: ```bash sudo caddy fmt /etc/caddy/Caddyfile --overwrite ``` 最后重启 Caddy ```bash sudo systemctl restart caddy ``` 耐心等待自动签发 SSL 证书,然后我们就可以打开浏览器控制台查看 `https://example.com/` 即可看到 SSL 证书已经自动部署,同时 HTTP/3 已经开启了: ![HTTP/3](https://s.bh.sb/img/2022/12/e3e00d.png) 更多的配置可以参考[官方文档](https://caddyserver.com/docs/caddyfile)或[《Caddyfile 语法浅析》](https://mritd.com/2021/06/30/understand-caddyfile-syntax/)