下載Caddy
caddy官網下載地址https://caddyserver.com/download。也可以直接點此下載linux amd64版本。 目前最新版本為2.4.6
如果是需要申請泛域名證書則需要勾選對應dns提供商的插件,比如cloudflare
注意:cloudflare不再支持.cf, .ga, .gq, .ml, .tk后綴域名使用api管理dns,也就是這些后綴的域名是不能通過cloudflare申請泛域名證書。
下載之后重命名為caddy拷貝到/usr/local/bin下即可。
配置文件Caddyfile
在任意目錄新建一個文件Caddyfile, 推薦位置為/etc/caddy/Caddyfile
輸入以下內容, 表示將www.mydomain.cf轉發到localhost:16325,並且自動通過let's encrypt申請ssl證書,申請郵箱為my@qq.com. 開啟tls則會默認把http重定向到https
www.mydomain.cf { reverse_proxy localhost:16325 tls my@qq.com }
如果是同時開啟http和https訪問則
www.mydomain.cf:80 www.mydomain.cf:443{ reverse_proxy localhost:16325 tls my@qq.com }
反向代理一般用於后端站點,前端站點則直接可以是靜態站點,如果是docker運行的也可以反向代理
以下為靜態站點配置,開啟https, 站點根目錄為/www/vue
www.mydomain.cf { tls my@qq.com root * /www/vue file_server }
啟動caddy
運行以下命令即可讓caddy進入后台運行。其中/etc/caddy/Caddyfile是配置文件Caddyfile所在路徑,--dapter caddyfile表示指定配置文件適配器為caddyfile格式,默認是json,caddyfile也可以翻譯為json.
如caddy adapt --config /etc/caddy/caddyfile > /etc/caddy/file.json就是將caddyfile翻譯為json並輸出,然后caddy start的config參數指定為json文件即可。
caddy start --config /etc/caddy/Caddyfile --adapter caddyfile
caddy start是后台啟動,但是日志會在當前控制台輸出,關閉當前控制台也會繼續運行
caddy run是前台啟動,當前控制台關閉進程也會關閉
二者參數一致
證書目錄在$XDG_DATA_HOME/certificates/acme-v02.api.letsencrypt.org-directory,$XDG_DATA_HOME在不同系統中對應關系如下
OS | Data directory path |
---|---|
Linux, BSD | $HOME/.local/share/caddy |
Windows | %AppData%\Caddy |
macOS | $HOME/Library/Application Support/Caddy |
Plan 9 | $HOME/lib/caddy |
Android | $HOME/caddy (or /sdcard/caddy ) |
也就是說linux下是~/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory。
修改數據存儲目錄[可選]
通過修改數據存儲目錄可以讓ssl證書存儲到其他路徑
Caddyfile增加全局配置storage。如下所示,會把數據目錄修改為/etc/ssl/caddy, 這樣證書所在路徑就變為了/etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory。
需要注意一下的是如果letsencrypt證書獲取失敗會自動改為獲取zerossl的證書,則路徑會變為/etc/ssl/caddy/certificates/acme.zerossl.com-v2-dv90
但是需要保證/etc/ssl/caddy存在且當前用戶有權限讀寫和修改,比如 sudo chmod 747 /etc/ssl/caddy -R.
caddyfile內容如下
{ storage file_system { root /etc/ssl/caddy } } www.mydomain.com { reverse_proxy localhost:16325 tls my@qq.com }
添加到systemd運行
新建文件/usr/lib/systemd/system/caddy.service(centos)或者/etc/systemd/system/caddy.service(ubuntu),內容如下. 記得將User=my中my修改為有權限的用戶名。
[Unit]
Description=Caddy HTTP/2 web server
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
User=my
Restart=on-abnormal
ExecStart=/usr/local/bin/caddy run --config=/etc/caddy/Caddyfile --adapter=caddyfile
ExecReload=/bin/kill -USR1 $MAINPID
; Use graceful shutdown with a reasonable timeout
KillMode=mixed
KillSignal=SIGQUIT
TimeoutStopSec=5s
ProtectSystem=full
[Install]
WantedBy=multi-user.target
然后執行
systemctl enable caddy.service
systemctl start caddy.service
systemctl status caddy.service
泛域名證書申請和使用
泛域名證書只能通過dns記錄來驗證,所以需要配置dns提供商的信息
對於.cf, .ga, .gq, .ml, .tk后綴的域名基本就告別自動泛域名證書了,cloudflare不允許通過api調用修改dns,而國內不允許此類域名備案。
1. 安裝對應域名提供商的dns模塊,常用的國內有阿里雲(alidns)和騰訊雲(dnspod), 國外有cloudflare 微軟(azure) 谷歌(googleclouddns)
可以在下載caddy時勾選對應模塊。如果沒有勾選也沒關系,可以通過命令行下載
cloudflare
cadd add-package github.com/caddy-dns/cloudflare
阿里雲
cadd add-package github.com/caddy-dns/alidns
騰訊雲
cadd add-package github.com/caddy-dns/dnspod
安裝完畢后修改caddyfile, 不同dns提供商的模塊配置略微有些區別
cloudflare
將cloudflare_key替換為自己的key, 從這里創建一個dns api令牌即可
*.my.com { tls {
dns cloudflare cloudflare_apikey
} }
阿里雲
key_id和key_secret來自控制台創建的accesskey,從這里可以創建,region就是賬戶所屬區域,可不填,默認為 zh-hangzhou
*.my.com { tls {
dns alidns { access_key_id key_id access_key_secret key_secret # region_id region
}
} }
騰訊雲
dnspod需要的是api token,由 ID,Token 組合而成的,用英文的逗號分割, 這里有說明如何創建Token. 如id為3245,token為sf3fwr234,則完整的api_token為 3245,sf3fwr234
*.my.com { tls { dns dnspod api_token }
泛域名證書的使用
默認目錄配置, 當前用戶為my, 域名為my.com
*.my.com { tls {
dns cloudflare cloudflare_apikey
} } www.my.com { proxy localhost:5000 tls /home/my/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.crt /home/my/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.key }
修改數據目錄為/etc/ssl/caddy后的配置
{ storage file_system { root /etc/ssl/caddy } } *.my.com { tls { dns cloudflare cloudflare_apikey } } www.my.com { reverse_proxy localhost:8080 tls /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.crt /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.key } api.my.com { reverse_proxy localhost:5000 tls /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.crt /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.key }