前言
最近想比较一下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的教程:
- 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。
参见
- https://github.com/mholt/caddy/issues/651
- https://github.com/mholt/caddy/issues/1673
解决方案
手工配置自动跳转
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 [email protected]
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/