使用Caddy部署网站

Caddy是一个功能强大、可扩展的平台,用Go编写,可为您的网站、服务和应用程序提供服务。

大多数人使用Caddy用作Web服务器或者代理服务。我是想让我的网站和小程序支持quic,而Caddy是一种解决方案。在使用Caddy前,我使用nginx作为网站服务器,以及小程序后台接口服务的代理。目前我已经在服务器上部署了Caddy,并将小程序后台服务和网站都迁移到Caddy上。虽然我配置了HTTP3协议,但是HTTP3并没有生效。网站和小程序可以正常访问,使用的是HTTP2协议。我折腾了一段时间,还是没有找到问题点,依旧是HTTP2协议或HTTP1.1协议。这并没有达到我的初衷。

之所以给大家继续推荐Caddy,是因为Caddy确实有一些优势。我说下在我服务器部署Caddy之后的感受吧。首先,Caddy在配置上要比Nginx简单,下面会详细介绍一下Caddy配置Web服务器和代理。其次,Caddy天然支持HTTPS,这对于网站和小程序后台,有很大的优势,特别是小程序后台,微信强制要求必须是HTTPS。性能这块,可能因为我的网站比较小,我并没有感到太大的差异(凭感觉,没有经过性能工具测试)因为使用Nginx或Caddy,我的网站和小程序访问都非常流畅。网上的帖子说Nginx性能会更好,特别是高并发时。在内存使用上,Caddy要远远大于Nginx,我的服务器内存比较小,这块非常明显。Nginx在我服务器上的内存占用在1MB左右,而Caddy在20MB左右。

现在我们讲下Caddy如何安装?在Caddy 的官网上,详细的介绍了Caddy的安装方法,我以我的服务器CentOS7为例,介绍一下Caddy的安装。

yum install yum-plugin-copr
yum copr enable @caddy/caddy
yum install caddy

安装非常简单,Caddy支持多种方法配置,API和配置文件,配置文件中又分JSON和Caddyfile。为了简单,这里仅介绍Caddyfile。如果你仅需要Web网站或服务代理。那么Caddyfile已经可以完全满足需求。如果你需要将Caddy作为Web服务平台,运行非常多的网站或者代理服务,那么你需要更深入的理解Caddy API。下面的配置都以我的网站和小程序后台服务为例。

先说下网站,我的网站【豆子笔记】(https://www.91demo.top)使用rust mdbook制作,通过编写Markdown文件,可生成静态的html文件。将生成的html文件上传到服务器某个目录。然后通过下面的配置,即可提供Web服务。让互联网用户访问你的网站。

下面是我的网站和反向代理配置文件,这些内容存储在/etc/caddy/Caddyfile文件中:

# 全局变量
{
  email myemail@qq.com
  servers {
    protocols h1 h2 h3
  }
}
# 日志,可共用
(logging) {
  log {
    output file /var/log/caddy/caddy.log {
      roll_size 50MiB
      roll_local_time
      roll_keep 5
    }
    format console {
      time_format rfc3339
      time_local
    }
    level INFO
  }
}

# 官网
www.91demo.top {
  import logging
  # 反向代理
  # 开放接口
  reverse_proxy /api/* localhost:9982
  # mqtt
  reverse_proxy /mqtt/ws localhost:18083 {
    stream_timeout 5m
    stream_close_delay 1m
  }

  # 静态网站
  root * /web/dist/book
  encode zstd gzip
  file_server
  redir /Ez12Pv https://imgs.91demo.top/visit.webp
  redir /Ez12Pw https://imgs.91demo.top/wander.webp
}

# 图片资源
imgs.91demo.top {
  import logging
  root * /web/dist/images
  # 图片
  @static {
    path_regexp \.(ico|gif|jpg|jpeg|png|svg|webp)$
  }
  header @static Cache-Control max-age=5184000
  rewrite /Ez12Pv /visit.webp
  rewrite /Ez12Pw /wander.webp
  file_server
}

# API后台
mp.91demo.top {
  import logging
  reverse_proxy localhost:9981
}

# 管理后台
h.91demo.top {
  import logging
  root * /web/admin
  encode zstd gzip
  file_server
}

更详细的内容,请参考Caddy官方文档,我这里仅以我的配置文件为例,进行简单讲解。

Caddyfile中可以定义全局变量,放在文件的最前面。里面存放你的邮件地址,以及Caddy提供的服务协议。其中邮件地址用于申请SSL证书时使用。接着是共用模块,例如日志模块,日志模块中的output配置路径需要存在,例如/var/log/caddy/caddy.log这个路径需要存在,并且caddy文件夹的拥有者需要是caddy用户和caddy组。这是一个坑,如果没有权限,就不会生成日志文件。再下面的官网www.91demo.top就是静态网站的配置了。www.91demo.top域名必须存在并且解析到了服务器的IP地址上。{}大括号中的内容为www网站的配置内容,里面包含了两个反向代理,以及一个静态文件服务,以及两个跳转配置。分别表示的是访问/api/时反向代理到后端开放接口服务,访问/mqtt/ws时反向代理到mqtt Websocket服务,以及访问/ 提供网站静态文件服务,访问/Ez12Pv会进行图片跳转(关注公众号后会看到这两个图片链接)。imgs.91demo.top提供图片服务,图片服务添加了缓存时间,其它的服务都和www服务中类似,更多的基础知识内容可以参考网上Caddy使用。

我所讲的,是基于自己的理解,如果有不对的或者有疑惑的地方,欢迎评论沟通。如果你没有公网云服务器,您想要一台公网云服务器,从下面的链接购买有优惠。

想在阿里云购买,请使用这个链接:

https://www.aliyun.com/minisite/goods?userCode=zrqh6alb

想在腾讯云购买,请使用这个链接:

https://curl.qcloud.com/XX6que5w

通过以上链接购买,有很大优惠。

Caddy服务器的GitHub地址:

https://github.com/caddyserver/caddy