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

前言

最近想比較一下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-systemd-failed-at-step-namespace-spawning-usr-local-bin-caddy-no-such-file-or-directory/423

改吧改吧,然后轉角遇到愛,尼瑪,又出現

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之類的,更完善。

源文鏈接

https://nickfan.github.io/2018/01/05/caddy-hugo-acme/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,826評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,734評論 25 708
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,485評論 2 45
  • 安娜和沃倫斯基的故事,從怦然心動的一顫開始,美麗俏佳人與英俊帥軍官,應該有一個圓滿的結局。可安娜一針一針為自己編織...
    鳳兒有約閱讀 517評論 0 6
  • 作者/齊天 我是一粒行走的塵埃 在每一個朝暮 往來于城市的街邊 我笑公車上的人,公車上的笑我 我們就這樣每天相視而...
    小圣齊天閱讀 415評論 33 33