内容简介:编写,单二进制文件没有其它依赖也可以很好的运行。本文以一个例子(短址服务)来介绍 caddy。在广泛使用在任意目录执行,实现当前目录的文件服务:
摘要
caddy 与
apache 、
nginx 一样是
HTTP server 程序,具有配置简单、自动
HTTPS 、默认
HTTP/2 等特性。使用
Golang
编写,单二进制文件没有其它依赖也可以很好的运行。本文以一个例子(短址服务)来介绍 caddy。
特性
在广泛使用 apache 和 nginx 这两个成熟 HTTP server 的环境中,不敢说后来居上,能有自己的一席之地,说明有一些优秀的特性吸引着用户。其中就包括:
- 方便得配置 : 相对于
apache和nginx需要的配置行数会少很多,且配置结构更清晰。 - 自动完成
https配置 : 在对安全需求加大的现在,caddy配置https不需要额外的代码,感谢 Let’s Encrypt - 默认
HTTP/2:HTTP/2是多路复用的单一长连接,可以加快数据传输,不过首屏访问速度 http>http2>https 可参考: HTTP 2 下 NGINX 反向代理的一些探索 - 多站点配置
- 插件
安装
-
直接命令行安装
$ curl https://getcaddy.com | bash -s personal
-
使用
docker镜像$ docker run -d \ -v $(pwd)/Caddyfile:/etc/Caddyfile \ -v $HOME/.caddy:/root/.caddy \ -p 80:80 -p 443:443 \ abiosoft/caddy
-
当然,学习原码或试用稳定版本还不支持的功能,也可自行编译:
$ go get github.com/mholt/caddy/caddy $ go get github.com/caddyserver/builds $ cd $GOPATH/src/github.com/mholt/caddy/caddy $ go run build.go
快速配置
在任意目录执行,实现当前目录的文件服务:
$ cat <<EOF > Caddyfile
localhost:8910 { # 开启文件服务
gzip # 开启 gzip 压缩
browse # 浏览器模式
}
EOF
配置完成之后只需要简单启动:
$ caddy
即可在浏览器中输入 http://localhost:8910 查看文件服务。
要为当前目录成为可以解析 markdown 的服务也很容易,生成简易的 markdown 接口文档很有用, 只需要换成如下配置。
$ cat <<EOF > Caddyfile
localhost:8910 { # 开启文件服务
gzip # 开启 gzip 压缩
browse # 浏览器模式
markdown / {
ext .md .txt
}
}
EOF
现在重新启动 caddy 你可以在当前文件夹下撰写 markdown 文档,如在 blog/features.md 中写入如下内容:
## 特性 在广泛使用 `apache` 和 `nginx` 这两个成熟 `HTTP server` 的环境中,不敢说后来居上,能有自己的一席之地,说明有一些优秀的特性吸引着用户。其中就包括: - 方便得配置 : 相对于 `apache` 和 `nginx` 需要的配置行数会少很多,且配置结构更清晰。 - 自动完成 `https` 配置 : 在对安全需求加大的现在,`caddy` 配置 `https` 不需要额外的代码,感谢 [Let's Encrypt](https://letsencrypt.org/) - 默认 `HTTP/2` : `HTTP/2` 是多路复用的单一长连接,可以加快数据传输,不过首屏访问速度 http>http2>https 可参考:[ HTTP 2 下 NGINX 反向代理的一些探索](https://www.v2ex.com/t/355624) - 多站点配置 - 插件
浏览器中查看结果:
线上配置
此小节介绍线上服务器如何配置以做到后台运行、简洁配置多站点、自动 https 。
系统不存在 www 用户与组的需要先创建。
$ groupadd www $ useradd -g www www
创建需要的文件夹:
$ mkdir -p mkdir /etc/caddy $ mkdir -p /etc/ssl/caddy $ chown -R www:www /etc/caddy $ chown -R www:www /etc/ssl/caddy $ chmod 0770 /etc/ssl/caddy
/etc/caddy 用来存放服务器配置文件; /etc/ssl/caddy 用来存放证书相关文件。
可先把上一步的 Caddyfile 复制到 /etc/caddy 先作测试
创建 systemd 配置文件,实现自启动,创建文件 /etc/systemd/system/caddy.service 写入如下配置
[Unit] Description=Caddy HTTP/2 web server Documentation=https://caddyserver.com/docs After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service [Service] Restart=on-abnormal User=www Group=www Environment=CADDYPATH=/etc/ssl/caddy ExecStart=/usr/local/bin/caddy -log /data/logs/caddy.log -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp -email=zhoujiangangcom@gmail.com ExecReload=/bin/kill -USR1 $MAINPID KillMode=mixed KillSignal=SIGQUIT TimeoutStopSec=5s LimitNOFILE=1048576 LimitNPROC=512 PrivateTmp=true PrivateDevices=false ProtectHome=true ProtectSystem=full ReadWriteDirectories=/etc/ssl/caddy [Install] WantedBy=multi-user.target
以上配置可能需要修改的地方
; caddy 运行的用户与组, root 权限太大,不推荐使用 User=www Group=www ; 证书配置路径 Environment=CADDYPATH=/etc/ssl/caddy ; 启动脚本 ; -log 将 caddy 程序运行时日志写到文件 ; -agree 自动 https 的时候要用到,表示同意 Let's Encrypt 加密协议 ; -conf Caddyfile 文件配置路径 ; -root 程序运行的根目录 ; -email 推荐加上,https 的时候要用到,方便撤销证书 ExecStart=/usr/local/bin/caddy -log /data/logs/caddy.log -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp -email=zhoujiangangcom@gmail.com ... ; 证书配置路径 ReadWriteDirectories=/etc/ssl/caddy
创建 caddy 服务并启动:
$ systemctl enable caddy.service # 设置 caddy 服务自启动 $ systemctl start caddy.service # 启动 caddy 服务 $ systemctl status caddy.service # 查看 caddy 状态
一个例子
介绍一个多 host 的短址服务来结束 caddy 的介绍。
可以了解到如下点: - 多 host 配置 - 301 , 302 重定向 - access log - header 头部设置 - 请求唯一 id : request_id
Caddyfile 中可以直接配置多个 host ,不过我为了后期方便修改,每个配置文件管理一个 host
创建配置文件夹:
mkdir -p /etc/caddy/conf.d
修改 /etc/caddy/Caddyfile 使得自动引入所有 /etc/caddy/conf.d/ 的配置, 如下:
import /etc/caddy/conf.d/*.conf
可在 /etc/caddy/conf.d/t.v2as.com.conf 写入如下配置文件:
t.v2as.com {
request_id
header / {
Cache-Control "no-cache"
}
log / /data/logs/t.v2as.com.log "{combined} {mitm}" {
rotate_size 100
rotate_age 30
rotate_keep 100
rotate_compress
}
redir 301 {
/tool https://6cm.com
/novel https://2pm.me
}
redir https://www.zhoujiangang.com{uri}
}
说明
- request_id : 生成唯一的请求 ID, 对于企业中的链路追踪很有用。
- header : 设置
Cache-Control "no-cache"301 时浏览器会缓存,设置为不缓存,可以追踪到每次短址的请求情况,方便后期分析access log。 - log :
/所有请求 写到/data/logs/t.v2as.com.log按照 “{combined} {mitm}” 格式写入这个日志文件中, - redir : 匹配路径,可方便发送 [300-308] 除 306 外的重定向状态码。
可在 /etc/caddy/conf.d/ 文件夹下写其它配置文件,方便配置多个 host ,如用 host 命令,则更加清晰明了。
重启 caddy 服务
$ systemctl restart caddy.service
可用 ps 查看是否已经启动
$ ps aux | grep caddy
小结
简单的短址就生成了,可以通过查看 access.log 来查看来源信息等,对于广告投放、来路统计很有意义。
当然需要自定义短址,可动态删改则需要再启动一个服务来进行转发。当转发服务在端口 8910 启动时,对于 caddy 配置这类的服务可用 proxy / 127.0.0.1:8910 进行配置。
整体来说, caddy 的配置可以说非常简洁,当然这里介绍的只是基础功能,官方还有很多优秀的插件像 http.hugo , http.jekyll 这样的博客插件,像 http.jwt 这样的 jwt 认证组件等。当然如果你熟悉 golang 还可以自己方便写插件,对比为 nginx 等服务写插件门槛会低很多。
附录
log 配置格式:
log path file [format] {
rotate_size mb
rotate_age days
rotate_keep count
rotate_compress
ipmask ipv4_mask [ipv6_mask]
except paths...
}
combined 日志格式:
{remote} - {user} [{when}] \"{method} {uri} {proto}\" {status} {size} \"{>Referer}\" \"{>User-Agent}\"
{mitm} caddy 能够检测 https 的中间人攻击,可以把此值写在 head 头部以提醒用户,也可放在 access log 中。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
How to Design Programs
Matthias Felleisen、Robert Bruce Findler、Matthew Flatt、Shriram Krishnamurthi / The MIT Press / 2001-2-12 / 71.00美元
This introduction to programming places computer science in the core of a liberal arts education. Unlike other introductory books, it focuses on the program design process. This approach fosters a var......一起来看看 《How to Design Programs》 这本书的介绍吧!