Caddy 是一个像 Apache,nginx,或 lighttpd 的 web 服务器。你要问 nginx 已经很好了,为什么要用 Caddy 呢?我觉得 Caddy 最大的特点是用起来简单,然后呢,它还有下面这些开箱即用的特性:
- HTTP/2 全自动支持 HTTP/2 协议,无需任何配置。
- Auto HTTPS Caddy 使用 Let’s Encrypt 让你的站点全自动变成全站 HTTPS,无需任何配置。当然你想使用自己的证书也是可以的。
- Multi-core 因为 Caddy 是 golang 写的,所以当然可以合理使用多核啦。
- IPv6 完全支持 IPv6 环境.
- WebSockets Caddy 对 WebSockets 有很好的支持.
- Markdown 自动把 md 转成 HTML,当然,我后续要给大家介绍更强大的 hugo 来干这个事情.
- Logging Caddy 对 log 格式的定义很容易,更好的满足你日志收集的需求。
- Easy Deployment 得益于 go 的特性,Caddy 只是一个小小的二进制文件,没有依赖,很好部署。

那么在什么场景下适合尝试使用 Caddy 呢,我推荐从以下场景开始:
- 作为静态页面的 WebServer
- 转发 fastcgi 请求到 php-fpm 服务,比如替换 Apache 或 Nginx 作为 WordPress 的 server
- 反向代理,管理多个站点
- 微服务的 API Gateway,我会专门写一篇文章。
- 有些在 Nginx 上难以开发的需求,为 Caddy 写插件太方便了。

入门
安装和下载 Caddy
把 Caddy(下载)放到系统的 PATH 中,让其可以直接执行。比如 Linux 中一般习惯放到/usr/local/bin
简单测试
- 找一个做测试的临时目录,生成一个测试主页。echo"hello world">index.html
- 执行 Caddy
- 在另一个终端 curl localhost:2015 或在浏览器访问(http://localhost:2015)
Caddyfile
Caddy 的一个特色就是配置简单,nginx 的配置文件群已经越看越晕了。我们来试试:
在当前目录创建这样一个叫 Caddyfile 的文件:
localhost:2020 gzip
这次,我们改变了端口,并且启用了 gzip 自动压缩数据。运行 Caddy,去你指定的地址看看吧。
说一句,Caddy 的潜规则是找当前目录叫 Caddyfile 的文件,你也可以用参数指定文件和路径。
更专业一点
我们随便说点高级功能,其实 Caddy 的文档挺不错的,看文档就可以了解各种功能。
自动 HTTPS
如果你满足这些条件,你用 Caddy 启动的应用将自动获得 HTTPS,不用你买证书了,这都是 Let's Encrypt 的功劳。
- host 那里要填一个域名,不能是 localhost 或 IP
- 不要用冒号手动指定端口
- 不要在域名前手动声明 http
- 没在配置里关掉 TLS 或者声明用自己的证书但是还没配好
- Caddy 有权限绑定 80 和 443 端口
前边都能懂,说下最后一条。在 init 文件夹的启动配置教程里都有,一般建议你用 www-data 用户启动服务,你不是 root 但是 Linux 依然可以让你绑定 80 端口,只需要执行
setcap cap_net_bind_service=+ep Caddy
具体看文档吧。
多站点
你可能想,之前用 nginx 主要是为了支持多站点,Caddy 当然也是可以的,你只需要配置若干域名,把每个域名的配置写在后边的大括号配置块里就行了。下一个例子里就有。
PHP or WordPress
据说全世界四分之一的站点都是 WordPress 搭建的,而 PHP 公认是世界上最好的语言。Caddy 还没有完全支持 unix socket 通讯呢,赶忙先把 PHP 支持了再说。
这是我自己博客的配置片段,我的荒芜的非技术博客依然用的 wordpress。timeouts 关键字是我摸索出来的,官方示例没有,不设置这个国内升级插件什么的根本成功不了。tls 其实用默认值是可以的,但是后台会有一堆落后的搜索引擎和爬虫报错,于是我调低了一点。另外我还把 www 定向到了裸域名,大家一般都这样做,或者反过来。
xiafeng.net { root /data/xiafeng/public timeouts 10m gzip tls { protocols tls1.0 tls1.2 } fastcgi / unix:/var/run/php/php7.0-fpm.sock php rewrite { if {path} not_match ^\/wp-admin to {path} {path}/ /index.php?_url={uri} } } www.xiafeng.net { redir https://xiafeng.net }
开机启动
因为大部分发行版目前还没办法直接安装 Caddy,开机启动可能需要你自己动手啦。
在你下载的压缩包中有一个 init 文件夹,里边有 Mac,Linux,FreeBSD 的开机启动配置帮助,还有示例脚本,可以根据你的要求再 DIY 一下。
Caddy 和 Nginx 的对比
Nginx 功能多,成熟稳定;
Caddy 功能也在慢慢增多,试着以不同方式实现 Nginx 的功能和新鲜的功能;
SSLDocker 专注于 HTTPS 管理和反向代理。
如果说 Nginx 是成功中年人士,则 Caddy 是年轻高富帅,SSLDocker 是嫩屌丝。