阿熊的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阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,085评论 2 44
  • 安娜和沃伦斯基的故事,从怦然心动的一颤开始,美丽俏佳人与英俊帅军官,应该有一个圆满的结局。可安娜一针一针为自己编织...
    凤儿有约阅读 480评论 0 6
  • 作者/齐天 我是一粒行走的尘埃 在每一个朝暮 往来于城市的街边 我笑公车上的人,公车上的笑我 我们就这样每天相视而...
    小圣齐天阅读 392评论 33 33