前言
最近想比較一下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的教程:
都有一些小坑,比如:
- 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
啟動不了
參考 https://caddy.community/t/starting-with-sy...
改吧改吧,然後轉角遇到愛,尼瑪,又出現
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... 文件,並下載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/setti...
新增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之類的,更完善。
源文連結:
https://nickfan.github.io/2018/01/05/caddy...
本作品採用《CC 協議》,轉載必須註明作者和本文連結