iTimothy

Caddy Server初体验

Caddy Server是基于Go开发的Web服务软件。其实,早在大概一两年前,我就有关注到它,只是因为公司和个人的服务器,大多仍然使用Nginx,也不知道Caddy Server在生产环境中使用的用户群体到底规模如何,就一直没机会尝试。最近,在给公司的GitLab服务器开启HTTPS支持的时候,偶然想起了Caddy Server,于是乎,打算正式的体验一把。

从Caddy Server官方的介绍中,大致知道Caddy Server的几个有点:

  • 部署方便,由于是Go开发的,所以,只需要一个可执行文件,就可以运行Caddy Server了
  • 跨平台,也是因为是由Go开发的,好处不言而喻,可以交叉编译并运行在多个平台
  • Graceful Reload: 修改配置文件后,支持无downtime的配置文件重新加载和读取,不影响现有业务的运行
  • 配置简单,这也是感觉比较方便的,比起Nginx,配置文件真的是非常简洁
  • 丰富的插件系统,支持多种扩展插件,通过不同的插件,实现相当多的扩展功能
  • 多核支持,嗯,能够充分利用多核性能,这也是因为Go的并发特性和运行时所带来的便利吧
  • 天生的HTTPS支持, 我觉得这大概算一亮点吧,能把证书申请和配置一系列繁琐的事情简化到极致

看完上面的特性,打算在自己的阿里云服务器上折腾一把,于是就先拿自己的blog开刀了:

1
2
3
4
5
6
7
xiaozhou.net www.xiaozhou.net {
tls i@xiaozhou.net
root /home/xiaozhou
index index.html index.htm
gzip
log /home/logs/xiaozhou.log
}

把上面的配置,保存为Caddyfile,然后就可以运行Caddy Server了。初次启动的过程当中,Caddy Server会自动帮你申请SSL证书并进行配置。由于我的blog都是hexo生成的静态站点,所以也不需要反向代理,直接指向对应的目录里面host起来就行了。7行的配置文件,就host起来一个博客站点,就这么简单?对啊!就这么简单!

随后,在浏览器中,不管是用http还是https访问,都会自动跳转到https的站点,一切都是那么省心。如果有多个站点,在Caddyfile中直接添加其他站点的配置即可。

由于Caddy Server本身是一个独立的可执行文件,所以,需要考虑一下让Caddy Server能够在后台持续的运行,比较low的方式,是nohup运行,当然你还可以依赖upstart, systemd, supervisor等进程守护工具来让Caddy Server能以后台的方式持续运行。

当然,还可以用比较高逼格的玩法,用docker来运行Caddy Server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '2'

services:
caddy:
container_name: caddy
image: abiosoft/caddy
volumes:
- "/etc/caddy/certs:/etc/caddycerts"
- "/etc/caddy/Caddyfile:/etc/Caddyfile"
- "/home:/home"
ports:
- 80:80
- 443:443
network_mode: "host"
restart: always
environment:
CADDYPATH: /etc/caddycerts

编写docker-compose.yml文件,其主要作用是把宿主机器上的Caddyfile挂载到Caddy Server的容器中,并相应的挂载用来存放SSL证书的目录,这样,就不用每次容器重新启动的时候,耗费时间重新申请证书了。然后,让容器直接使用宿主机器的网络,并把/home目录也映射到Caddy Server中,让其可以直接host到我的blog站点。

一切准备就绪之后,直接运行容器中的Caddy Server:

1
docker-compose up -d

这样,一个运行在docker中的Caddy Server就已经启动了,容器也随机器的重启,自动启动。另外,由于是使用LetsEncrypt的免费SSL证书,就算证书过期之后,也不需要手动renew,Caddy Server会自动帮你搞定一切的!

Caddy Server其实还有许多的插件,通过配置,可以实现很多的功能,以后可以逐一慢慢体验。

支持原创技术分享,据说打赏我的人,都找到了女朋友!