caddy.png

本文介绍了在 Debian 10 环境下,Caddy 2 的编译、安装及配置。

看完本文后,你将可以使用 Caddy2 的:

  • HTTP
  • HTTPS
  • 反向代理
  • WebDav
  • DNSPod DNS api
  • ...

等功能。

本文部分内容转自 https://mritd.com/2021/01/07/lets-start-using-caddy2/

一、编译 Caddy2

注意: 在 Caddy1 时代,Caddy 官方发布的预编译二进制文件是不允许进行商业使用的,Caddy2 以后已经全部切换到 Apache 2.0 License,具体请参考 issue#2786

在默认情况下 Caddy2 官方提供了预编译的二进制文件,以及自定义 build 下载页面,不过对于需要集成一些第三方插件时,我们仍需采用官方提供的 xcaddy 来进行自行编译;以下为具体的编译过程:

1.1、Golang 环境安装

本部分编译环境默认为 Debian 10 系统,使用 root 用户,其他环境请自行调整相关目录以及配置;

编译时请自行处理好科学上网相关配置,也可以直接用国外 VPS 服务器编译。

首先下载 go 语言的 SDK 压缩包,其他平台可以从 https://golang.org/dl/ 下载对应的压缩包:

cd ~
wget https://golang.org/dl/go1.16.3.linux-amd64.tar.gz

下载完成后解压并配置相关变量:

# 解压
tar -zxvf go1.16.3.linux-amd64.tar.gz

# 移动到任意目录
mkdir -p /opt/devtools
mv go /opt/devtools/go

# 创建 go 相关目录
mkdir -p ${HOME}/gopath/{src,bin,pkg}

# 调整变量配置,将以下变量加入到 shell 初始化配置中
# bash 用户请编辑 ~/.bashrc
export GOROOT='/opt/devtools/go'
export GOPATH="${HOME}/gopath"
# 如果是国内机器,需要导入添加代理
# export GOPROXY='https://goproxy.cn' 
export PATH="${GOROOT}/bin:${GOPATH}/bin:${PATH}"

# 让配置生效
# 重新退出登录也可以
source ~/.bashrc

配置完成后,执行 go version 有返回信息:

go version

# 屏幕输出
go version go1.16.3 linux/amd64

1.2、安装 xcaddy

按照官方文档直接安装即可:

# 使用官方命令安装 xcaddy
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/gpg.key' |  tee /etc/apt/trusted.gpg.d/caddy-xcaddy.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-xcaddy.list
apt update
apt install xcaddy

# 查看 xcaddy 版本
xcaddy version

1.3、编译 Caddy2

编译之前系统需要安装 jqcurlgit ,没有请使用 apt install -y curl git jq 命令安装;

自行编译的目的是增加第三方插件方便使用,其中官方列出的插件可以从 Download 页面获取到。

其他插件可以从 GitHub 上寻找或者自行编写,整理好这些插件列表以后只需要使用 xcaddy 编译即可:

# 获取最新版本号,其实直接去 GitHub realse 页复制以下就行
# 这里转化为脚本是为了方便自动化

#获取caddy2的最新版本号,并导入变量version
export version=$(curl -s "https://api.github.com/repos/caddyserver/caddy/releases/latest" | jq -r .tag_name)

# 使用 xcaddy 编译
xcaddy build ${version} --output ./caddy_${version} \
        --with github.com/abiosoft/caddy-exec \
        --with github.com/caddy-dns/cloudflare \
        --with github.com/caddy-dns/dnspod \
        --with github.com/caddy-dns/namecheap \
        --with github.com/caddy-dns/alidns \
        --with github.com/caddy-dns/duckdns \
        --with github.com/caddy-dns/gandi \
        --with github.com/caddy-dns/route53 \
        --with github.com/greenpau/caddy-auth-jwt \
        --with github.com/greenpau/caddy-auth-portal \
        --with github.com/greenpau/caddy-trace \
        --with github.com/hairyhenderson/caddy-teapot-module \
        --with github.com/kirsch33/realip \
        --with github.com/porech/caddy-maxmind-geolocation \
        --with github.com/caddyserver/format-encoder \
        --with github.com/mholt/caddy-webdav

编译过程较慢,稍等片刻后将会生成编译好的二进制文件。

编译完成后,会出现一个 caddy_v2.3.0 的文件;

编译成功后可以通过 ./caddy_v2.3.0 list-modules 子命令查看被添加的插件是否成功编译到了 caddy 中:

# 查看被添加的插件
./caddy_v2.3.0 list-modules

# 屏幕输出
admin.api.load
admin.api.metrics
caddy.adapters.caddyfile
caddy.listeners.tls
caddy.logging.encoders.console
caddy.logging.encoders.filter
caddy.logging.encoders.filter.delete
caddy.logging.encoders.filter.ip_mask
caddy.logging.encoders.formatted
caddy.logging.encoders.json
caddy.logging.encoders.logfmt
caddy.logging.encoders.single_field
caddy.logging.writers.discard
caddy.logging.writers.file
caddy.logging.writers.net
caddy.logging.writers.stderr
caddy.logging.writers.stdout
caddy.storage.file_system
dns.providers.cloudflare
dns.providers.dnspod
dns.providers.duckdns
dns.providers.gandi
dns.providers.route53
exec
http
http.authentication.hashes.bcrypt
http.authentication.hashes.scrypt
http.authentication.providers.http_basic
http.authentication.providers.jwt
......
Copy

二、安装 Caddy2

2.1、宿主机安装

宿主机安装 Caddy2 需要使用 systemd 进行守护,幸运的是 Caddy2 官方提供了各种平台的安装包以及 systemd 配置文件仓库

目前推荐的方式是先采用包管理器安装标准版本的Caddy2,然后替换自编译的可执行文件:

# 安装标准版本 Caddy2,默认配置文件目录: /etc/caddy/Caddyfile
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/gpg/gpg.155B6D79CA56EA34.key' | apt-key add -
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/setup/config.deb.txt?distro=debian&version=any-version' |  tee -a /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy

# 替换二进制文件:将编译的 /root/caddy_v2.3.0 文件移至 /usr/bin/caddy 
systemctl stop caddy
rm -f /usr/bin/caddy
mv ./caddy_v2.3.0 /usr/bin/caddy
# 查看caddy是否安装成功
caddy version

启动

# 开机自启
systemctl enable caddy

# 启动caddy2
systemctl start caddy

# 停止caddy2
systemctl stop caddy

# 重载配置caddy配置文件(修改配置文件后执行)
systemctl reload caddy

# 查看caddy运行状态
systemctl status caddy

2.2、Docker 安装

Docker 用户可以通过 Dockerfile 自行编译 image ...

三、配置 Caddy2

Caddy2 的配置文件核心采用 json,但是 json 可读性不强;

关于 Caddyfile 的完整语法请查看官方文档 https://caddyserver.com/docs/caddyfile,本文仅做一些基本使用的样例。

3.1、配置示例

编辑默认的配置文件: /etc/caddy/Caddyfile

修改配置文件后,使用 systemctl reload caddy 重载配置;

  1. 静态网页配置:

    https://yourdomain.com {
        root * /home/www/website
        file_server
        tls your@email.com
    }

    ​ 使用自定义SSL证书:

    https://yourdomain.com {
        root * /home/www/website
        file_server
        tls /etc/caddy/cert/ssl.pem /etc/caddy/cert/ssl.key
    }
  2. 文件列表配置:

    https://yourdomain.com {
        root * /home/files
        file_server browse
        tls your@email.com
    }
  3. 反向代理配置:

    https://yourdomain.com {
        reverse_proxy https://hexo.io {
            header_up Host {http.reverse_proxy.upstream.hostport}
            header_down Access-Control-Allow-Headers *
            header_down Access-Control-Allow-Origin *
        }
        tls your@email.com
    }
  4. Websocket反向代理配置:

    https://ws.yourdomain.com {
        ## HTTP 代理配置
        ## 此时访问 ws.yourdomain.com,实际访问的是 127.0.0.1:8080/app/ 的内容
        reverse_proxy / 127.0.0.1:8080/app/
    
        ## WebSocket 代理配置
        ## 客户端请求的 wss://ws.yourdomain.com/ws, 实际为 wss://127.0.0.1:8080/ws
        reverse_proxy /ws 127.0.0.1:8080
    }
  5. WebDav配置

    先使用命令将明文密码进行加密:

    caddy hash-password --plaintext yourpasswd
    
    # 屏幕输出密文,后续的配置文件中使用
    JDJhJDE0JEdoTFhJbjhDaUEzM3kvV3pKYVFCdHVPeEg0V3NQQnl3a2pNNkNSd0Y0MmtFWFl3bUJaaXdt

    编辑配置文件:

    {
        order webdav last
    }
    https://webdav.yourdomain.com {
        webdav {
            root /home/webdav
        }
        
        # 密码不能为明文,可以使用自带的工具加密:
        # caddy hash-password --plaintext yourpasswd
        # 用户名为:username,密码为:yourpasswd
        basicauth {
            username JDJhJDE0JEdoT...
        }
        
        tls your@email.com
    }

四、其他说明

caddy2 默认配置文件的目录位置,证书位置:
配置文件目录:/var/lib/caddy/.config/caddy
SSL证书文件目录:/var/lib/caddy/.local/share/caddy