从Nginx到Caddy
起因
长久以来,这个Hexo博客都是以Nginx静态目录的方式,以Docker的形式部署。但随着腾讯云轻量的服务跑的越多,反向代理的需求逐渐增大,让Nginx跑在Docker里终究不太方便。外加服务器系统版本始终没有升级上去(CentOS 7.6),本着尝鲜的心态将Nginx转为了Caddy。
Caddy介绍
Ask GPT:
Caddy是一个开源的、使用Go编程语言编写的Web服务器引擎。它被广泛使用在Web开发中,因为它的配置简单,功能强大,而且支持HTTP/2和自动HTTPS。
Caddy的主要特点是:
自动HTTPS:Caddy可以自动从Let’s Encrypt获取和更新SSL证书,为你的站点提供安全的HTTPS连接。
HTTP/2支持:Caddy支持最新的HTTP/2协议,可以提供更快的网页加载速度。
易于配置:Caddy的配置文件格式简单明了,易于理解和修改。
插件支持:Caddy有大量的插件,可以为你的服务器添加各种功能
跨平台:Caddy可以在Windows、Mac、Linux等多种操作系统上运行。
总的来说,Caddy是一个现代化的、易于使用的Web服务器引擎,非常适合用来构建和托管Web应用。
下载
可以去Github搜索Caddy,这应该不难找到。
想要自己加插件的话,需要用到xcaddy。但官网提供套件组合可以编译下载。我自己是选了WebDav和Geoip2两个插件。选好后就可以Download
https://caddyserver.com/download
Tips:
最初是选了WebDav + WebHook的组合,但这个页面编译不通过就放弃了这个打算
配置
首先绕不开的,就是如何把Nginx的configure转为Caddyfile
最初准备Github Copilot Chat一把梭,但最近GPT 4输出偷懒,只能自己查文档自己写Caddyfile😅
首先是域名跳转。之前博客的网址一直都是https://www.mocusez.site
但现在想想,觉得https://mocusez.site
这个短域名就够了。为此需要加上重定向,并且强制https连接
http://mocusez.site {
redir https://mocusez.site{uri}
}
http://www.mocusez.site {
redir https://mocusez.site{uri}
}
https://www.mocusez.site {
redir https://mocusez.site{uri}
}
想开启静态托管也不难,加上file_server
即可,顺带开启gzip压缩传输大小,.git
目录隐藏(吐槽一下,.git
目录是漏洞不假,但某些机构发邮件提醒是不是太那个啥了😅我这个git目录暴露又没什么关键信息)。
https://mocusez.site {
root * public
file_server {
hide .git
}
encode gzip
}
配置先前的TLS证书需要配置证书路径
tls ssl/mocusez.site_bundle.crt ssl/mocusez.site.key
简单过滤下请求头和请求方法。Caddy就这点上我觉得体验不如Nginx:居然不支持批量检查头部
@badUserAgents header User-Agent *Python-urllib*
respond @badUserAgents 403
@badMethods not method GET HEAD POST
respond @badMethods 403
@notAllowedReferer header_regexp Referer ^(http://localhost|https://mocusez.site).*
respond @notAllowedReferer 403
配置好后,先运行caddy fmt --overwrite
对文件格式化使其更耐看
caddy start
后台运行。
如果有什么修改就caddy reload
,Caddy会检查新修改的配置是否符合规范,不符合规范就会保留原有配置不变,不用担心乱改配置文件导致服务停摆😍。
反向代理这块,比Nginx要省心不少。reverse_proxy
一把梭
https://aif.mocusez.site {
reverse_proxy {
to qlma.site
}
}
借此机会把自建的S3图床挂上,解决图片加载过慢的问题。
你跟我说没有HTTPS证书😝?只要设置好DNS指向,Caddy会自动帮我们申请证书,并且自动续期,不再需要去腾讯云的控制面板上申请证书,也不必担心每年的续期申请。
如果要限制访客来源国家,可以使用GeoLite2
的数据库进行拦截,插件配置的Example请看https://github.com/zhangjiayin/caddy-geoip2
{
order geoip2_vars first
geoip2 {
databaseDirectory "/data/caddy/geo/"
editionID "Country"
}
}
https://mocusez.site {
geoip2_vars strict
@geofilter expression {geoip2.country_code} != "CN"
redir @geofilter https://www.google.com
}
最后想了想,觉得没什么意思,所以并没有开启相关拦截。
HTTP3
最初知道Caddy是因为其宣称支持HTTP3,而Nginx直到2023年12月还没有合并QUIC分支。而在配置选项里,Caddy也的确有HTTP3的选项。
那么,最后开了没有呢?我的回答是:如开😂
如果你通过Chrome插件wappalyzer查看我的博客,会显示HTTP3是开的
然后打开控制台,协议显示HTTP2
要是用https://http3check.net/检查,甚至可以得到HTTP1.1的报文🙄
后面我还用curl-http3
测试了一下,发现依然是HTTP2。看他们英文社区的讨论似乎也不保证最后是以HTTP3的形式访问,所以HTTP3的尝试也就到此为止了
日志处理
参考 一行代码快速配置 Caddy 站点日志 —— 复用 Caddy 配置段 进行配置
(log) {
log {
output file log/{args[0]}/access.log {
roll_size 100MiB
roll_local_time
roll_keep 10
roll_keep_for 2160h
}
format json
}
}
日志分析工具,建议使用GoAccess的Docker版本
https://github.com/allinurl/goaccess#docker
function generate_report() {
cat log/$1/access.log | docker run --rm -i -e LANG="zh_CN.UTF-8" allinurl/goaccess -a -o html --log-format CADDY - > $1.html
}
generate_report mocusez.site
打出报告完以后发现自己博客升级后忘记添加RSS插件😂有意思的意外发现
GoAccess还提供了实时查看,但想想没有必要,就没去做了
tail -F access.log | docker run -p 7890:7890 --rm -i -e LANG=$LANG allinurl/goaccess -a -o html --log-format COMBINED --real-time-html - > report.html
结语
Nginx确实强大好用,但Caddy配置起来更为简单😃
下次要我选,我还选Caddy
另外吐槽下,CentOS7.6确实太老了,但腾讯云轻量又不提供AlmaLinux和RockyLinux的镜像😑。我承认Ubuntu和Debain镜像是不错,但服务器Linux我只选yum系。