前言
最近想比較一下caddy和nginx的服務及功能,
設定的目標是用hugo搭建一個靜態站點然后通過Caddy服務起來提供
https://axiong.me 的訪問。
于是就走上了一條不斷踩坑的不歸路,在此記錄一下踩坑、填坑的過程。
第〇個踩到的坑:github的CNAME站點不支持https
理論上站點也可以放在github的gh-pages上,所以我就嘗試了
Tips
我用的是gh-pages的分支方案
項目master分支根節點可以加gitignore忽略掉hugo的發布路徑public,方便測試
注意安裝主題的話最好用submodule的方式而不是文檔中的git clone,比如:
git submodule add https://github.com/christianmendoza/hugo-smpl-theme themes/hugo-smpl-theme
這樣后續部署的時候才不會遇到尷尬的項目沒法自動部署的問題。
問題
github的CNAME站點不支持https
不過@根域名CNAME記錄和MX記錄TXT記錄沖突,蛋疼(免費郵局服務不想放),而且MD不支持https,所以,方案被我斃掉了。
解決方案
自己有vps就可以任性一下了,也順便搗騰一下Caddy的https服務
第一個踩到的坑:Caddy自動申請證書不成功
就是Caddy自動申請 Let's Encrypt 的請求總是總是timeout,
不知道是不是因為解析服務用cloudxns的問題,而caddy目前還沒有cloudxns的組件。
解決方案
用 Acme.sh 這個自動腳本做配置做證書的issue和renew,注意要采用dns的api模式,畢竟到這一步Caddy的服務還被申請證書卡著。
參考:Acme.sh說明
1. 證書申請
acme.sh --issue --dns -d axiong.me
2. 到解析服務商后臺添加對應的Txt記錄
我的是cloudxns基本上就是加一條的Txt類型記錄,_acme-challenge為主host部分記錄,內容部分是acme終端中給出的。
3. 重新生成證書
acme.sh --renew -d axiong.me
4. 到你的解析服務商后臺申請API的key和secret
參考鏈接
5. 導出/安裝證書到本地供后續Caddy使用
acme.sh --installcert -d axiong.me --key-file /etc/ssl/caddy/certs/axiong.me/ssl.key --fullchain-file /etc/ssl/caddy/certs/axiong.me/fullchain.cer --reloadcmd "systemctl restart caddy"
按照acme.sh的說明,它的crontab腳本會自動續期證書。
免費ssl證書問題至此算是告一段落。
第二個踩到的坑:Caddy+Hugo組合配置問題
網上有Caddy+Hugo的教程:
- http://www.gohugo.org/post/qhsong-host-hugo-blog-using-caddy/
- https://laozhu.me/post/deploy-blog-with-caddy-and-hugo/
都有一些小坑,比如:
- caddy的插件有依賴必須通過他官方的服務整合編譯,上面的配置中依賴http.hugo,http.minify,http.git等
- caddy的官方下載如果插件加多了很可能給你返回500,安裝失敗
- caddy的hugo插件,hugo指令必須是環境變量里支持的,我適用golang開發環境的hugo如果作為系統服務就會找不到
- caddy的配置問題,errors節點里不能配置log指令
解決方案
查文檔,看官方說明,例子。
1. caddy+插件下載問題,至少需要http.git,http.minify,http.hugo
精簡插件數量只裝必要的
Caddy官方的下載頁面可以定制,定制完畢頁面最下方有命令行指令參考
https://caddyserver.com/download
一鍵安裝指令:
curl https://getcaddy.com | bash -s personal dns,hook.service,http.git,http.hugo,http.minify,tls.dns.rfc2136
或者用下載鏈接下載后解壓縮后把caddy放到/usr/local/bin/caddy
wget -O "caddy.tar.gz" "https://caddyserver.com/download/linux/amd64?plugins=dns,hook.service,http.git,http.hugo,http.minify,tls.dns.rfc2136&license=personal"
2. hugo指令必須是環境變量里支持的,去官方直接下載發行版的安裝包
注意apt-get或者snap安裝的版本會比較老,建議直接去 https://github.com/gohugoio/hugo/releases 下載
比如ubuntu用的.deb的包
下載后安裝
sudo dpkg -i hugo_xxx_Linux-64bit.deb
第三個踩到的坑:Caddy的ulimit問題
其實不算是Caddy的鍋,系統的limits配置我的vps沒調整,Caddy會報
caddy: WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with "ulimit -n 8192".
解決方案
臨時解決方案就是執行提示里的
ulimit -n 8192
再跑caddy,徹底的解決方案是修改系統的limits配置:
sudo vim /etc/security/limits.conf
追加 對文件句柄的配置設定
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
第四個踩到的坑:Caddy的默認端口是2015
Caddy的配置有個坑,如果tls不是他它自動簽發的模式,的情況下
http的端口用的是2015。
參見
解決方案
手工配置自動跳轉
http://axiong.me {
redir https://axiong.me
}
https://axiong.me {
tls ssl.cer ssl.key
...
}
第五個踩到的坑:Caddy自啟動的Systemd配置問題
配置Caddy的Systemd自啟動遇到
caddy.service: Failed at step NAMESPACE spawning /usr/local/bin/caddy: No such file or directory
啟動不了
改吧改吧,然后轉角遇到愛,尼瑪,又出現
ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp (code=exited, status=226/NAMESPACE)
Main PID: xxx (code=exited, status=226/NAMESPACE)
解決方案
死活找不到原因,怒了,重新按社區貢獻的配置文檔重新整了一遍,
參考 https://github.com/mholt/caddy/tree/master/dist/init/linux-systemd 文檔,并下載caddy.service作為模板
重新一步步把用戶權限配置了一遍,搞定,不在出現226/NAMESPACE問題。
優化完善Caddy配置
查Caddy的官方文檔,完整的解決配置文件Caddyfile內容問題
修改后的完整示例:
http://axiong.me {
redir https://axiong.me
}
https://axiong.me {
#tls off
#tls admin@example.com
tls /etc/ssl/caddy/certs/axiong.me/fullchain.cer /etc/ssl/caddy/certs/axiong.me/ssl.key
minify
gzip
log / /var/log/caddy/pub-axiong.me_access.log "{combined}" {
rotate_size 100 # Rotate a log when it reaches 100 MB
rotate_age 14 # Keep rotated log files for 14 days
rotate_keep 10 # Keep at most 10 rotated log files
rotate_compress # Compress rotated log files in gzip format
}
errors /var/log/caddy/pub-axiong.me_error.log {
404 404.html # Not Found
rotate_size 100 # Rotate a log when it reaches 100 MB
rotate_age 14 # Keep rotated log files for 14 days
rotate_keep 10 # Keep at most 10 rotated log files
rotate_compress # Compress rotated log files in gzip format
}
root /var/www/axiong.me/public
git {
repo https://github.com/nickfan/axiong.me
path /var/www/axiong.me
then hugo --destination=/var/www/axiong.me/public
hook /webhook [你在github后臺設置的webhook的口令]
hook_type github
clone_args --recursive
pull_args --recurse-submodules
interval 3600
}
hugo
}
其中webhook就是你代碼托管服務比如github上代碼repo后臺設定中添加一下webhook這樣代碼提交以后就會自動構建你的新靜態網站
比如我的托管在github上webhook.settings設定在 https://github.com/nickfan/axiong.me/settings/hooks
添加webhook,PayloadURL填寫你域名/webhook,比如我的:
https://axiong.me/webhook
content-type選json
secret填寫和Caddyfile中的口令保持一致
其他保持默認即可。
至此Caddy才算是初步可以看了。
- 有訪問日志、有錯誤日志,日志都有rotate不會撐滿磁盤。
- 有minify+gzip做輸出優化
- 免費自定義ssl證書,有錢你換DV,OV級別的我也沒意見
- 自動http->https跳轉
- 改完站點提交代碼后webhook自動發布上線
TODO
webhook的配置可以從Caddyfile配置中用環境變量替換出來,放到Systemd的附加配置里,比如加個override.conf之類的,更完善。
源文鏈接