请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Caddy——比 Nginx 功能更强大的 Web 服务器

[复制链接]
gaosmile 发布时间:2021-2-23 12:09
Caddy 简介
Caddy 是一个 Go 编写的 Web 服务器,类似于 Nginx,Caddy 提供了更加强大的功能,随着 v2 版本发布 Caddy 已经可以作为中小型站点 Web 服务器的另一个选择;相较于 Nginx 来说使用 Caddy 的优势如下:
  • 自动的 HTTPS 证书申请(ACME HTTP/DNS 挑战)
  • 自动证书续期以及 OCSP stapling 等
  • 更高的安全性包括但不限于 TLS 配置以及内存安全等
  • 友好且强大的配置文件支持
  • 支持 API 动态调整配置(有木有人可以搞个 Dashboard)
  • 支持 HTTP3(QUIC)
  • 支持动态后端,例如连接 Consul、作为 k8s ingress 等
  • 后端多种负载策略以及健康检测等
  • 本身 Go 编写,高度模块化的系统方便扩展(CoreDNS 基于 Caddy1 开发)
  • ……1 X  F; [; i5 Q) E+ R6 \' x
就目前来说,Caddy 对于我个人印象唯一的缺点就是性能没有 Nginx 高,但是这是个仁者见仁智者见智的问题;相较于提供的这些便利性,在性能可接受的情况下完全有理由切换到 Caddy。
编译 Caddy2
注意: 在 Caddy1 时代,Caddy 官方发布的预编译二进制文件是不允许进行商业使用的,Caddy2 以后已经全部切换到 Apache 2.0 License。
在默认情况下 Caddy2 官方提供了预编译的二进制文件,以及自定义 build 下载页面,不过对于需要集成一些第三方插件时,我们仍需采用官方提供的 xcaddy 来进行自行编译;以下为具体的编译过程:
Golang 环境安装
本部分编译环境默认为 Ubuntu 20.04 系统,同时使用 root 用户,其他环境请自行调整相关目录以及配置;编译时自行处理好科学上网相关配置,也可以直接用国外 VPS 服务器编译。
首先下载 go 语言的 SDK 压缩包,其他平台可以从 https://golang.org/dl/ 下载对应的压缩包:
wget https://golang.org/dl/go1.15.6.linux-amd64.tar.gz
9 Q- d* |# N9 q* N
下载完成后解压并配置相关变量:
# 解压
# n2 I! d/ ?. I4 K. a4 y9 Ktar -zxvf go1.15.6.linux-amd64.tar.gz" W. `! h; ~! q8 @
: R$ k) a% Z5 M" F8 a
# 移动到任意目录
7 k7 r8 u9 Z+ X! \9 r2 Hmkdir -p /opt/devtools1 n; e. {, ]5 w9 [
mv go /opt/devtools/go
2 ~$ y( b& g3 C( y9 d& _& K1 I) [( S
5 s1 L( I* ?$ T8 x! S4 `8 |. m# 创建 go 相关目录
( z' |& R1 s% T* C# F; K3 ?mkdir -p ${HOME}/gopath/{src,bin,pkg}2 O2 b5 J$ Z0 g7 b% a4 ^

% P2 l. e' a4 N* t1 u# 调整变量配置,将以下变量加入到 shell 初始化配置中
, f( b( z$ ?: ^# `# bash 用户请编辑 ~/.bashrc
/ ~3 R2 K7 v0 L3 {7 T# zsh 用户请编辑 ~/.zshrc5 r9 @- n* `7 r8 k2 n
export GOROOT='/opt/devtools/go'
* p: i. }" I5 R) J1 Pexport GOPATH="${HOME}/gopath"
' w: Z0 [' S7 n# y) @5 }export GOPROXY='https://goproxy.cn' # 如果已经解决了科学上网问题,GOPROXY 变量可以删除,否则可能会起反作用
4 X5 `5 u  {" l8 D: Cexport PATH="${GOROOT}/bin{GOPATH}/bin{PATH}"
& `. t& w' J3 x, W1 a% ]) M! F6 l- |0 {6 W+ \* l9 b
# 让配置生效
1 g3 \. j. X4 S% z* S" t, t! h# bash 用户替换成 ~/.basrc
9 i( \+ |+ n$ H3 s0 s# 重新退出登录也可以, g- M, ]4 f9 A( V% M; x
source ~/.zshrc/ F. P0 x2 ^3 ?; p4 s: H4 M1 t
配置完成后,应该在命令行执行 go version 并有以下成功返回:
bleem ➜ ~ go version
$ B0 H  j+ Q: r" I+ Wgo version go1.15.6 linux/amd64
3 m' h# Q& {& Y
安装 xcaddy
按照官方文档直接命令行执行 go get -u github.com/caddyserver/xcaddy/cmd/xcaddy 安装即可:
bleem ➜ ~ go get -u github.com/caddyserver/xcaddy/cmd/xcaddy5 R* N+ w& Q0 B+ r2 L1 H* t5 f
go: downloading github.com/caddyserver/xcaddy v0.1.7! S9 |2 E) i" O/ W. q; h  e
go: found github.com/caddyserver/xcaddy/cmd/xcaddy in github.com/caddyserver/xcaddy v0.1.7% H4 V# Q8 f& G. o, C3 q
go: downloading github.com/Masterminds/semver/v3 v3.1.0
0 s  P( G! W. P" igo: github.com/Masterminds/semver/v3 upgrade => v3.1.11 v$ {0 X) p+ @
go: downloading github.com/Masterminds/semver/v3 v3.1.1% `9 Q3 h/ a& a1 I
.....
2 C9 S7 v6 T7 |
安装完成后应当在命令行可以直接执行 xcaddy 命令:
# xcaddy 并没有提供完善的命令行支持,所以 `--help` 报错很正常
( d1 Z6 |( U: J; `bleem ➜  ~ xcaddy --help$ l: L% L9 e5 g; P( u9 ]# X0 U
go: cannot match "all": working directory is not part of a module
2 F! ?' P% s( b2021/01/07 12:15:56 [ERROR] exec [go list -m -f={{if .Replace}}{{.Path}} => {{.Replace}}{{end}} all]: exit status 1:+ ^. s6 U. H" G2 U4 n) N
编译 Caddy2
编译之前系统需要安装 jq、curl、git 命令,没有的请使用
apt install -y curl git jq
/ `5 _, a8 U- L& t; r
命令安装;
自行编译的目的是增加第三方插件方便使用,其中官方列出的插件可以从 Download 页面获取到:
微信图片_20210223120643.png
其他插件可以从 GitHub 上寻找或者自行编写,整理好这些插件列表以后只需要使用 xcaddy 编译即可:
# 获取最新版本号,其实直接去 GitHub realse 页复制一下就行
3 r8 ^+ l" q2 y9 {, ^# 这里转化为脚本是为了方便自动化
$ f. p# l) O- l1 H$ A( Q, d9 ^export version=$(curl -s "https://api.github.com/repos/caddyserver/caddy/releases/latest" | jq -r .tag_name); n9 m2 t0 d. I$ Q
! c& Z% |, D+ [
# 使用 xcaddy 编译
* T5 `9 v3 R6 K. F. `xcaddy build ${version} --output ./caddy_${version} \; @, D2 N* A+ X2 L/ Y" p
        --with github.com/abiosoft/caddy-exec \, R+ H, t2 d1 j; L! K
        --with github.com/caddy-dns/cloudflare \
7 f+ V$ j' M5 s4 C, P! d" u        --with github.com/caddy-dns/dnspod \
. @/ ]& I0 Z2 ~7 [1 K        --with github.com/caddy-dns/duckdns \& s  \) h" U  P1 I
        --with github.com/caddy-dns/gandi \. u1 [; i" D3 F6 w: O+ F  S
        --with github.com/caddy-dns/route53 \- |) x$ o  Y- H; }: y  ~
        --with github.com/greenpau/caddy-auth-jwt \
/ _' {( n) n0 ~/ b! @' z) z+ l        --with github.com/greenpau/caddy-auth-portal \3 }; d" Q4 h, ~/ l5 ?6 v1 E2 ?
        --with github.com/greenpau/caddy-trace \
5 O0 c! J8 j- [4 a' H$ T# |0 b        --with github.com/hairyhenderson/caddy-teapot-module \  q8 F. _$ F9 s. b/ c7 X& {
        --with github.com/kirsch33/realip \) g- @& g6 ^  Z: |
        --with github.com/porech/caddy-maxmind-geolocation \
/ K- g2 e) \+ K2 i) u5 H        --with github.com/caddyserver/format-encoder \0 B+ h& x, j  P/ [6 v. y
        --with github.com/mholt/caddy-webdav% S; @  \. w" f! z
编译过程日志如下所示,稍等片刻后将会生成编译好的二进制文件:
微信图片_20210223120646.png " W: _  i9 [+ f2 W7 q- L6 D
编译成功后可以通过 list-modules 子命令查看被添加的插件是否成功编译到了 caddy 中:5 Y6 D2 V% I, S3 p" ~# @
bleem ➜  ~ ./caddy_v2.3.0 list-modules9 G- x1 o. c. A* W5 t/ b3 ^
admin.api.load
5 z  z- L5 W9 c/ ?admin.api.metrics  g% O0 M6 v& D) s) u
caddy.adapters.caddyfile
, r# A) i3 c; e; v7 v& }" ?: vcaddy.listeners.tls
1 w7 l8 p( a3 N( {caddy.logging.encoders.console
" t, h, H7 J; E1 mcaddy.logging.encoders.filter
. |. q8 X9 ~. b- D6 h" k6 ccaddy.logging.encoders.filter.delete
) z% G& q6 V7 Z( q9 ecaddy.logging.encoders.filter.ip_mask
$ i! L* F, H, C: v  Mcaddy.logging.encoders.formatted
1 K4 }, X' K- |+ p3 C5 Mcaddy.logging.encoders.json
2 _" @& }0 W' x3 X$ X3 f; hcaddy.logging.encoders.logfmt; b* H" x7 ?8 ?2 J, w
caddy.logging.encoders.single_field3 ?9 C6 S# I. M0 \& |/ w
caddy.logging.writers.discard& j: }& e4 v5 B; t
caddy.logging.writers.file; G7 R9 z: ?: W/ @1 V
caddy.logging.writers.net
. G6 G) Q0 I: K0 N; K* lcaddy.logging.writers.stderr( R; A0 N: q7 E# h- F6 m
caddy.logging.writers.stdout
. b) T. M0 i* T* R' wcaddy.storage.file_system; m3 `  Z5 Z/ f8 I) G; H
dns.providers.cloudflare
2 V: m3 U2 Z- W# F, X- P! d! Rdns.providers.dnspod
, k3 v( N7 P! H  xdns.providers.duckdns
2 k* C7 W* U% b, u2 @1 l$ E9 Wdns.providers.gandi
+ P/ E! g; T( [: hdns.providers.route535 I( ?, _" o9 H0 o! g9 ]& ~
exec- c5 W2 D6 l! w& a# Z
http! t# ]. M1 I0 i/ `( j
http.authentication.hashes.bcrypt
+ H  I& F% T( Z% ]* ]http.authentication.hashes.scrypt
+ h  D5 e5 o, F1 e! X4 ahttp.authentication.providers.http_basic
) c: g0 z+ s$ h; F' z, c4 thttp.authentication.providers.jwt
" C- g% o6 u; c8 ~) ^......4 y7 p3 @6 s) K4 J# I
安装 Caddy2宿主机安装
宿主机安装 Caddy2 需要使用 systemd 进行守护,幸运的是 Caddy2 官方提供了各种平台的安装包以及 systemd 配置文件仓库;目前推荐的方式是直接采用包管理器安装标准版本的 Caddy2,然后替换自编译的可执行文件:
# 安装标准版本 Caddy2  T# L2 r- Z! {$ j
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
$ s1 D" K/ K6 K& M* Ccurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/gpg/gpg.155B6D79CA56EA34.key' | sudo apt-key add -
5 b% h) h3 V. a0 ecurl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/setup/config.deb.txt?distro=debian&version=any-version' | sudo tee -a /etc/apt/sources.list.d/caddy-stable.list
: A- f& S9 s4 ]: }, o  {: Rsudo apt update1 V' o/ J/ w6 W3 q" y
sudo apt install caddy4 Y- L- ~! R; c0 w) L2 h

( s6 X! ?1 G9 a0 W* r# 替换二进制文件* A: i7 B$ I; s0 s6 n' W, @
systemctl stop caddy
( {- {! r+ h! ^5 z" p: \rm -f /usr/bin/caddy
/ S1 j5 A6 f# o9 B) B0 gmv ./caddy_v2.3.0 /usr/bin/caddy
& X- X/ b; ]& M' l" F$ S
Docker 安装
Docker 用户可以通过 Dockerfile 自行编译 image,目前我编写了一个基于 xcaddy 的 Dockerfile,如果有其他插件需要集成自行修改重新编译即可;当前 Dockerfile 预编译的镜像已经推送到了 Docker Hub 中,镜像名称为 mritd/caddy。
配置 Caddy2
Caddy2 的配置文件核心采用 json,但是 json 可读性不强,所以官方维护了一个转换器,抽象出称之为 Caddyfile 的新配置格式;关于 Caddyfile 的完整语法请查看官方文档 https://caddyserver.com/docs/caddyfile,本文仅做一些基本使用的样例。
配置片段
Caddyfile 支持类似代码中 function 一样的配置片段,这些配置片段可以在任意位置被 import,同时可以接受参数,以下为配置片断示例:
# 括号内为片段名称,可以自行定义
! I. |. X4 g. v3 r% f' o7 X4 K(TLS) {
# J2 x" |/ Y4 b. e3 I    protocols tls1.2 tls1.3
7 P6 F7 y4 M: R. S5 H2 R    ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA2569 N5 S+ D, N# N
}
  i/ U7 _# R( @. O" e  Y* E
! `$ y% O2 P2 q! {2 p* G3 S0 M4 j# 在任意位置可以引用此片段从而达到配置复用
4 O! g, G! m% _) \; t, vimport TLS
+ @4 }& P4 _* }& e( e7 x
配置模块化
import 指令除了支持引用配置片段以外,还支持引用外部文件,同时支持通配符,有了这个命令以后我们就可以方便的将配置文件进行模块化处理:
# 引用外部的 /etc/caddy/*.caddy9 I( C, E7 F' l; n2 a; s: H9 t, L# {& a
import /etc/caddy/*.caddy/ A: \3 X! O# i$ `: N3 v
站点配置
针对于站点域名配置,Caddyfile 比较自由化,其格式如下:
地址 {
( q: q8 q8 p' f% u- J) J( _    站点配置. W: Y3 f( k2 v+ `
}9 z0 @9 _* Y- q1 K4 G' A
关于这个 “地址” 接受多种格式,以下都为合法的地址格式:
localhost9 ?& ^8 J9 [9 N
example.com- z" E# u' K+ [! z
:443
  o* @) F! G! c) Shttp://example.com. f8 C7 B) a! N& j6 s
localhost:8080
( m2 N, R" U/ G4 _127.0.0.1
- g7 [) n6 S* Y[::1]:2015
' G5 [8 m$ q/ R7 z2 Pexample.com/foo/*0 @! l0 x6 _4 _9 \# N
*.example.com
+ x! E+ n# I. [" G3 B" f; Ohttp://) a' \, _7 B- B( l- Z/ M3 G
环境变量
Caddyfile 支持直接引用系统环境变量,通过此功能可以将一些敏感信息从配置文件中剔除:
# 引用环境变量 GANDI_API_TOKEN
8 R3 }. `8 i$ s& {dns gandi {$GANDI_API_TOKEN}
( m6 `) X) N( \% J% [
配置片段参数支持
针对于配置片段,Caddyfile 还支持类似于函数代码的参数支持,通过参数支持可以让外部引用时动态修改配置信息:
(LOG) {; b5 ~7 v+ S1 B2 ]& W% V: t8 A9 O4 y
    log {
( ?2 n: G" g2 O+ T: l        format json  {0 Y4 w: [! q0 Z$ u" L
            time_format "iso8601"
$ M6 x" a' f6 }        }
. P5 p3 H/ p% e/ L' k2 y        # "{args.0}" 引用传入的第一个参数,此处用于动态传入日志文件名称* p1 [* ^7 K- X, A  j- G* P$ Y4 V) [
        output file "{args.0}" {6 @* Z: U) ~& c
            roll_size 100mb
3 \: f% v3 P' m% h            roll_keep 3/ I9 H: w1 i; `9 x
            roll_keep_for 7d3 |. M* w4 q, K& I0 T. T' g& n" i
        }) y' Y6 _8 g* a
    }
# O5 b2 \/ i+ }3 i, ~, ~5 J}
) Q( v0 j- x3 h' }7 M- A5 P" t" R$ \6 |9 Z* {- t" e
# 引用片段! e  R5 F4 q6 M! q" y2 _5 S8 F7 j- v
import LOG "/data/logs/mritd.com.log"
5 j6 V$ H& Y/ h+ j, Z
自动证书申请
在启动 Caddy2 之前,如果目标域名(例如: www.example.com)已经解析到了本机,那么 Caddy2 启动后会尝试自动通过 ACME HTTP 挑战申请证书;如果期望使用 DNS 的方式申请证书则需要其他 DNS 插件支持,比如上面编译的 --with github.com/caddy-dns/gandi 为 gandi 服务商的 DNS 插件;关于使用 DNS 挑战的配置编写方式需要具体去看其插件文档,目前 gandi 的配置如下:
tls {
% O3 P. c) Q% o$ c+ T dns gandi {env.GANDI_API_TOKEN}
! j4 w% p+ b2 Q2 d: s! w}
3 J& g7 b. u$ Z, W6 w; ]6 @9 q
配置完成后 Caddy2 会通过 ACME DNS 挑战申请证书,值得注意的是即使通过 DNS 申请证书默认也不会申请泛域名证书,如果想要调整这种细节配置请使用 json 配置或管理 API。
完整模块化配置样例
了解了以上基础配置信息,我们就可以实际编写一个站点配置了;以下为本站的 Caddy 配置样例:
目录结构:
caddy8 R$ R3 L" l9 `$ W* U  l
├── Caddyfile
& M2 m1 j7 m* N# R' K" [├── mritd.com.caddy# l3 m. e. V/ b
└── mritd.me.caddy* r7 h# H/ \; |
Caddyfile
Caddyfile 主要包含一些通用的配置,并将其抽到配置片段中,类似于 nginx 的 nginx.conf 主配置;在最后部分通过 import 关键字引入其他具体站点配置,类似 nginx 的 vhost 配置。
(LOG) {
7 I* w+ E) n8 }% e: @    log {1 Z* X. R% \( t5 c
        # 日志格式参考 https://github.com/caddyserver/format-encoder 插件文档, K& m% X( X. |* Q" f, [5 G
        format formatted "[{ts}] {request>remote_addr} {request>proto} {request>method} <- {status} -> {request>host} {request>uri} {request>headers>User-Agent>[0]}"  {
3 f  {: V/ f- y. M2 y. O            time_format "iso8601"4 y) `! W8 y' {0 `
        }* ?0 e7 x* C$ A( ~+ s0 X
        output file "{args.0}" {/ I5 \+ P, p* N
            roll_size 100mb5 j& R) K  @% ~4 R; x
            roll_keep 3( B/ G, I9 u- i9 o. S3 [/ M- @& ?
            roll_keep_for 7d6 J8 Y  ^: m8 W8 T8 ]
        }
9 x! t) S% ^. n7 F. e+ |# n    }
$ E5 G" N* N# ^) e8 |4 }4 l5 t* `' f}
) R  I! o# G% ?) \. q- Y2 Q8 p0 Z, ~' c8 S& r% y5 c4 O
(TLS) {
( V9 }5 _) e$ O) a3 I5 d    # TLS 配置采用 https://mozilla.github.io/server-side-tls/ssl-config-generator/ 生成,SSL Labs 评分 A+. j5 `& m3 a8 F7 {" m/ W+ K
    protocols tls1.2 tls1.3
2 f) Q9 E5 p0 C    ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256& w4 W  L2 h) r3 c1 [8 O
}
* _5 C' d9 j" t# u" k% P9 }6 a
( I$ o& R. W6 F! o(HSTS) {- G  _+ L. ]& T: \, F4 ^" L
    # HSTS (63072000 seconds)
2 R: l- m+ l: D& Y% D6 ]5 X    header / Strict-Transport-Security "max-age=63072000"
. U# X, `* ?1 G! m}' I; X* T+ y/ O
$ \% }) A* \' J# O2 W
(ACME_GANDI) {
/ [: d& E  H4 J1 F    # 从环境变量获取 GANDI_API_TOKEN
% u( E+ H) G2 e$ Q7 M    dns gandi {$GANDI_API_TOKEN}5 C! c" H9 ~0 ~
}
) O( |: g! G1 X2 p) ?5 _$ o4 J# R1 s: D
# 聚合上面的配置片段为新的片段
# d$ k6 N! a! w9 L6 i0 i5 f(COMMON_CONFIG) {& r! I/ Z# u% U9 y" R! o5 Y7 e
    # 压缩支持9 P' d+ V+ B; g2 x) B3 y: t7 G
    encode zstd gzip
" J" e" z6 Z( e4 C  k, a. f+ ]" ^0 Z* i7 N
    # TLS 配置$ {; M* j" b0 v* P
    tls {4 V4 Q. G/ F, p* S1 p4 H
        import TLS
6 n# t6 p! s& w( |" k        import ACME_GANDI
# X( O) C* e" T8 \    }# J" N/ Q8 U0 z$ H2 y0 N5 W
. N$ V( a0 A1 E2 n
    # HSTS+ [. [2 q( R; b6 w5 b
    import HSTS3 e# _: l( e  s! o) n1 G3 @6 M
}
0 D) L& {2 n+ C7 n! V5 v; X& ^5 S' R$ B& z1 ~
# 开启 HTTP3 实验性支持
1 s4 P/ v# y6 Q7 {" g2 @! l{' g+ E/ B7 |( n) N
    servers :443 {1 F1 ~- l9 ?6 p5 ?% o3 }0 x. F
        protocol {
8 |" n! @" F6 {. {            experimental_http3
2 h1 [0 _1 Q  [* F/ @2 {9 u% O        }0 N, t6 K! m1 w& e
    }
9 V. @; V0 I: C9 R}
  I/ B4 n; u$ M2 Y7 [1 Y8 W+ ]  }* e7 V3 d; H0 R( P
# 引入其他具体的站点配置5 X/ g2 Z) a+ Y; ?" d7 x, s4 }# i
import /etc/caddy/*.caddy! B$ e; a% d( p- i
mritd.com.caddy
mritd.com.caddy 为主站点配置,主站点配置内主要编写一些路由规则,TLS 等都从配置片段引入,这样可以保持统一。
www.mritd.com {2 j+ F# d4 L1 k: c: S: T
    # 重定向到 mritd.com(默认 302)* z% G0 E% Q* c% ?
    redir https://mritd.com{uri}3 O+ |. F) L. T# c, T
3 w$ K3 G4 r2 k3 h6 G5 c
    # 日志
9 N' a2 K7 L. Q! R    import LOG "/data/logs/mritd.com.log"0 p4 O/ g$ h! _7 E% Q
  l9 D+ ~1 u$ ~# C7 v7 W# I
    # TLS、HSTS、ACME 等通用配置
; G$ a7 j9 S" [    import COMMON_CONFIG
1 q" l, }* o# m}
. v- r9 D9 {2 j! o9 ~- ^1 c$ ~. `) p6 M
mritd.com {
3 X) x; Y$ k) i$ d3 F# d; o& {' e    # 路由" H+ V0 y4 V5 F; C" z7 ~( p+ Z
    route /* {8 D( t7 J% t& j: _+ s. b
        reverse_proxy mritd_com:80! H6 q, Y$ J  N) F, l/ U# Y0 V  @
    }- k- J4 e  G6 `0 x( s

. l/ v- p4 y+ _    # 日志# ]3 x: j2 m4 ]" H1 K( y. b
    import LOG "/data/logs/mritd.com.log"( V( j7 P9 ~$ R6 |- E) s+ k
; o& b! T5 o2 i6 u
    # TLS、HSTS、ACME 等通用配置
, }9 I1 P2 u2 ?  l2 X% N    import COMMON_CONFIG* u/ t9 W# x- w) x
}
1 o. }. D" ^! H1 P; s
mritd.me.caddy
mritd.me.caddy 为老站点配置,目前主要将其 301 到新站点即可。
www.mritd.me {
, Q, Y/ Q6 F1 ]# v5 R0 p; o    # 重定向到 mritd.com
! u& b4 A4 C1 Q5 s$ {4 V    # 最后的 "code" 支持三种参数
' z# }# I0 C2 t1 Z5 @    # temporary => 302; i! `6 ]) ~/ j1 j
    # permanent => 301
8 K* h3 [% D0 t. `    # html => HTML document redirect
# O( g$ H3 W- c% C9 T8 \( \    redir https://mritd.com{uri} permanent# W' `& ?- _: Y% x# Q" G2 W7 N
  j& J* e2 d! F. C* _
    # 日志
/ ]; l, `( c; p    import LOG "/data/logs/mritd.com.log"
# \- R& \! A# G% A6 u0 D9 u) v/ ?- J8 r
    # TLS、HSTS、ACME 等通用配置
2 h; T" ^6 J4 `5 z, P) V& }6 Z    import COMMON_CONFIG
9 b. P& A8 Y/ K2 i}
" m6 V8 n8 M# h! s3 [# q
2 ?* k6 L$ I8 I. W/ E- mmritd.me {8 `9 D' ?$ e$ [' E) Z
    # 重定向
# N* [2 d3 b, C3 o& K- {    redir https://mritd.com{uri} permanent. b$ s6 }/ X3 j6 k: Z

- v2 e# G9 [% |7 F    # 日志: }* J1 ^8 Q- p% e
    import LOG "/data/logs/mritd.com.log"6 m  v5 F/ `1 q4 }# t4 I
) S3 Z+ W* C/ `; w* O9 G
    # TLS、HSTS、ACME 等通用配置
, C( X1 z# w- ~$ O    import COMMON_CONFIG
- R5 e1 ^6 c6 M( \3 g) n}
) X6 O3 a' Z2 {' ~: ]4 g1 E; |' c
启动与重载
配置文件编写完成后,通过 systemctl start caddy 可启动 caddy 服务器;每次配置修改后可以通过 systemctl reload caddy 进行配置重载,重载期间 caddy 不会重启(实际上调用 caddy reload 命令),当配置文件书写错误时,重载只会失败,不会影响正在运行的 caddy 服务器。
总结
本文只是列举了一些简单的 Caddy 使用样例,在强大的插件配合下,Caddy 可以实现各种 “神奇” 的功能,这些功能依赖于复杂的 Caddy 配置,Caddy 配置需要仔细阅读官方文档,关于 Caddyfile 的每个配置段在文档中都有详细的描述。
值得一提的是 Caddy 本身内置了丰富的插件,例如内置 “file_server”、内置各种负载均衡策略等,这些插件组合在一起可以实现一些复杂的功能;Caddy 是采用 go 编写的,官方也给出了详细的开发文档,相较于 Nginx 来说通过 Lua 或者 C 来开发编写插件来说,Caddy 的插件开发上手要容易得多;Caddy 本身针对数据存储、动态后端、配置文件转换等都内置了扩展接口,这为有特定需求的扩展开发打下了良好基础。
最终总结,综合来看目前 Caddy2 的性能损失可接受的情况下,相较于 Nginx 绝对是个绝佳选择,各种新功能都能够满足现代化 Web 站点的需求,真香警告。

$ [6 U4 g0 V* x( |8 g
收藏 评论0 发布时间:2021-2-23 12:09

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版