阿熊的 Caddy+Hugo+Acme.sh 配置填坑筆記

nickfan發表於2018-01-05

前言

最近想比較一下caddy和nginx的服務及功能,

設定的目標是用hugo搭建一個靜態站點然後透過Caddy服務起來提供

https://axiong.me 的訪問。

於是就走上了一條不斷踩坑的不歸路,在此記錄一下踩坑、填坑的過程。

第〇個踩到的坑:github的CNAME站點不支援https

理論上站點也可以放在github的gh-pages上,所以我就嘗試了

Hugo託管到Github的流程說明

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

參考連結

Acme.sh的DNSApi的配置說明

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 協議》,轉載必須註明作者和本文連結

相關文章