Caddy - Go 语言编写的开源WEB服务器

Caddy https://caddyserver.com/

1.Caddy介绍

在追求性能的道路上,nginx已经一骑绝尘。这种情况下诞生的 Caddy有什么特性呢?

Caddy的作者Matt Holt有这样的理念: 其他Web Server为Web而设计,Caddy为human设计。可以看出Caddy主打易用性,使用配置简单。

Caddy 是用 Go 语言编写的开源、支持 HTTP/2 的 Web 服务器。

Caddy 最突出的功能就是自动为托管网站启用TLS。Caddy 会自动从 Let’s Encrypt 获取并更新 TLS 证书。

Caddy 也可以配置成为反向代理服务器,通过 Apache 2许可协议发行。

得益于Go的跨平台特性,Caddy很容易的支持了三大主流系统:Windows、 Linux、Mac。

2.Caddy Web服务器的特性:

1)HTTP/1.1 和 HTTP/2 协议支持
2)HTTPS 自动启用 TLS
3)支持虚拟主机
4)原生 IPv4 和 IPv6 支持
5)反向代理
6)负载均衡支持
7)Gzip 内容压缩
8)Caddy 对WebSockets有很好的支持
9)合理使用多核,得益于go的特性

3.CentOS 7 系统安装 Caddy

3.1 安装 Caddy

由于 Caddy 是由 Go 语言开发,直接下载程序包解压后即可运行,虽然可以正常使用,但是过程比较麻烦。使用如下命令也可以安装最新版的 Caddy:

# curl https://getcaddy.com | bash -s personal

由于 Caddy 是针对个人用户免费,所以加入了"personal"选项,脚本执行完成后,Caddy 就安装安装成功了。

脚本其实就是帮我们下载对应操作系统最新版的 Caddy 可执行文件,然后把它解压到"/usr/local/bin"目录里。其配置文件需要自己添加。Caddy 的配置文件叫作"Caddyfile",习惯上把它放置在"/etc/caddy"目录。

3.2 创建用户及配置目录

为安全起见,Web 服务器一般不使用 root 用户来启动,所以需要创建一个 "caddy"用户,来启动 Caddy Web 服务器。全部命令如下所示:

# mkdir /var/www                                   //创建网站根目录
# adduser -r -s /sbin/nologin -d /var/www caddy    //创建启动 Caddy 用户
# chown caddy:caddy /var/www                       //修改网站根目录属主
# mkdir /etc/caddy                                 //创建配置文件目录
# touch /etc/caddy/Caddyfile                       //创建配置文件
# chown -R root:caddy /etc/caddy                   //修改配置文件属主
# mkdir /etc/ssl/caddy                             //创建证书文件目录
# chown -R caddy:root /etc/ssl/caddy               //修改 Caddy 证书目录属主
# chmod 0770 /etc/ssl/caddy                       //修改 Caddy 证书目录权限

完成以上准备工作后,理念上 Caddy 就可以正常运行了。可以试着执行一下"caddy"命令,会提示服务器启动并且侦听了"2015"端口,浏览器打开的话会得到"404 Not Found",说明 Web 服务器已经可以工作了,只是需要配置一下让它符合我们的要求。

3.3 为 Caddy 创建 systemd 服务

直接使用命令启动 Caddy 多少有些不方便,还好官方提供了一个添加 systemd 服务的配置文件,按其配置文件添加服务后,Caddy 就可以按照我们预先的设计来工作了。配置文件为"/usr/lib/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

StartLimitIntervalSec=14400
StartLimitBurst=10

User=caddy
Group=caddy

Environment=CADDYPATH=/etc/ssl/caddy

ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
ExecReload=/bin/kill -USR1 $MAINPID

KillMode=mixed
KillSignal=SIGQUIT
TimeoutStopSec=5s

LimitNOFILE=1048576
LimitNPROC=512

PrivateTmp=true
PrivateDevices=false
ProtectHome=true
ProtectSystem=full
ReadWritePaths=/etc/ssl/caddy
ReadWriteDirectories=/etc/ssl/caddy

[Install]
WantedBy=multi-user.target

至此,Caddy 服务已经添加成功。

3.4 Caddyfile 文件中添加 Web 服务器

Caddy 的配置文件添加 Webt 服务器非常容易,只需要指定 HTTP 路径即可。根据之前的设定,我们添加一个 Web 服务器:

http:// {
    root /var/www
    gzip
}

配置内容也很好理解,就是设置侦听的虚拟目录和网站的实际目录,并且启用 gzip 压缩。

根据配置项,我们在网站实际目录添加一个index.html文件,大致内容如下:

<html>
    <head><title>Hello World</title>
    <body><h1>Hello World</h1></body>
</html>

再通过浏览器打开网站,就可以看到我们预告设定的首页了。

3.5 Caddy 服务器配置 TLS

自动 TLS 是 Caddy Web服务器的独特功能,可将 Caddy 与其他 Web服务器区分开。

如果配置了自动TLS,则 Caddy Web 服务器会自动从 Let’s Encrypt(一个免费,自动和开放的证书颁发机构)请求并续订TLS证书。

Caddy 配置自动证书也非常简单,只需要编辑 Caddyfile 加入自动TLS即可:

caddy.daehub.com {
    root /var/www
    gzip
    tls service@daehub.com
}

需要强调的是:
1)由于 Let’s Encrypt 的工作机制要求,caddy.daehub.com 需要为互联网实际注册的域名
2)tls 指令后面为获取 Let’s Encrypt 证书时使用的邮箱,可以自行设置
3)tls 指令会通知 Caddy 服务进程使用 Let’s Encrypt 证书来启动 HTTPS服务。

4. 其他配置

4.1 目录浏览功能

caddy.daehub.com {
        gzip
        root /var/www/download
        browse
}

4.2 透明代理

caddy.daehub.com {
        gzip
        proxy / localhost:port {
                transparent
        }
}

4.3 日志格式

log requests.log "{remote} {when} {method} {uri} {proto} {status} {size} {>User-Agent} {latency}" {
    rotate_size 50  # Rotate after 50 MB
    rotate_age  90  # Keep rotated files for 90 days
    rotate_keep 20  # Keep at most 20 log files
}

4.4 地址跳转

http://www.mysite.com {
    redir https://mysite.com
}

4.5 内网证书自签名

www.mysite.com
gzip
tls self_signed
proxy / localhost:8080

参考文档

https://blog.csdn.net/lvshaorong/article/details/78065178
https://www.xargin.com/migrate-from-nginx-to-caddy/
http://www.voidcn.com/article/p-ewdgmqpj-ug.html
https://www.daehub.com/archives/8498.html