Web 服务器是 Web 开发中不可或缺的基础服务,在开发中经常会用到。耳熟能详的开源 Web 服务器有久负盛名的 Apache、性能强劲的 Nginx。这里介绍一个开源的项目是采用 Go 编写的 Web 服务端“后起之秀”:Caddy 它拥有下载无需安装就能用、零配置实现 HTTPS 等特点,从而在强者如云的 Web 服务器中占据了一席之地。

Caddy2—开源 Web 服务器 - 图1

Caddy是一个现代化的Web服务器,以其简单性和自动HTTPS功能而闻名。它是一个快速、可扩展的跨平台HTTP/1-2-3网络服务器,其最大特点是默认自动实现HTTPS。Caddy不仅简化了网站的HTTPS配置过程,还通过其创新的设计,提供了易于理解的配置文件(Caddyfile)、动态配置、自动化证书管理等特性,极大地降低了网站安全部署的门槛。 Caddy的特点包括自动HTTPS、HTTP/2支持、IPv6、Markdown、WebSockets、FastCGI、模板等。它支持HTTP/1.1、HTTP/2和HTTP/3,保证了网站的高性能和未来兼容性。除此之外,Caddy通过其高度模块化的架构,支持各种插件扩展,无论是在性能、安全还是功能方面,都能满足开发者的需求。 在这个 HTTPS 必选的时代,Caddy 凭借无需额外配置自动 HTTPS,分分钟完成 HTTPS 站点搭建,使它成为了中小型 Web 服务的首选服务器。Caddy 深受开源爱好者们的喜爱,2014 年开源至今共收获了 3.6 万颗星。

Caddy2—开源 Web 服务器 - 图2

项目地址:https://github.com/caddyserver/caddy ## 为什么使用 Caddy ? Caddy 是一个功能强大、易于使用的现代化Web服务器,它提供了许多优势,例如自动HTTPS、反向代理、负载均衡等。Caddy适用于各种应用场景,从个人网站到大型Web应用。它的易用性、自动化HTTPS功能和丰富的插件生态系统使其成为现代Web服务的理想选择。 Caddy具有如下特性: + Caddyfile简单配置:提供简单、易于理解的配置文件格式。 + 动态JSON API:可实时更新配置,无需重启服务器。 + 默认启用HTTPS:为每个托管站点自动启用HTTPS,无需额外操作。 + 高扩展性:能够支持数十万站点,非常适合大规模部署。 + 现代协议支持:原生支持HTTP/1.1、HTTP/2 和HTTP/3。 + 跨平台运行:无外部依赖,在任何平台上都能稳定运行。 + 基于Go语言:能提供更高的内存安全性和可靠性。 使用 Caddy 可以在 Linux、Mac、Windows 上快速部署 http(s) 站点或反向代理服务。支持:
  • HTTP/1.1 和 HTTP/2
  • 同时接受 HTTPS 自动签发和手动管理
  • 虚拟主机 (多个站点工作在单个端口上)
  • 原生 IPv4 和 IPv6 支持
  • 静态文件分发
  • 平滑重启/重载
  • 反向代理 (HTTP 或 WebSocket)
  • 负载均衡和健康性检查
  • Markdown 渲染
  • 文件浏览服务
  • 等等
与传统的 Nginx 或者 Apache 相比,Caddy 整体只有一个可执行文件,安装便捷不易出现奇怪的依赖问题,配置文件结构清晰语法简单易于上手,依托于模块化架构可以使用 Go 语言快速开发扩展模块

用Docker快速搭一个HTTPS站点

快速实现HTTPS

  1. # 当前目录有一个配置文件 Caddyfile
  2. vim Caddyfile
  3. tooltt.com
  1. # 一行命令启动
  2. docker run -d --name caddy \
  3. -p 80:80 \
  4. -p 443:443 \
  5. -v $(pwd)/Caddyfile:/etc/Caddyfile \
  6. abiosoft/caddy
  7. docker run -p 80:80 -p 443:443 --name caddy \
  8. -v /mydata/caddy/Caddyfile:/etc/caddy/Caddyfile \
  9. -v /mydata/caddy/data:/data \
  10. -v /mydata/caddy/site:/srv \
  11. -d caddy

安装为系统服务

系统环境:Ubuntu 20.04 LTS

Caddy 可以作为一个系统服务安装,命令:
  1. sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
  2. curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
  3. curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
  4. sudo apt update
  5. sudo apt install caddy

Caddy2—开源 Web 服务器 - 图3

:::tips

注意:这种方式安装完成后会启动服务,开机自动启动。

:::

还可以下载一个可执行文件使用。

Caddy2—开源 Web 服务器 - 图4

  1. 下载地址:https://caddyserver.com/download
  2. 在网页上方选择自己的操作系统后,点击右侧蓝色的 Download 按钮即可
  3. 下载好的文件不能够直接运行,需要为其添加权限
  1. $ mv caddy_linux_amd64 caddy # 将下载后的文件重命名方便后面指令输入,根据系统不同文件名不一样
  2. $ sudo chmod a+x caddy # 为 Caddy 添加可执行权限
  3. $ mv caddy /bin/caddy # 将 Caddy 复制到 bin 目录这样可以在命令行随时使用
命令行执行 <font style="color:rgb(239, 112, 96);">caddy version</font> 命令,出现版本信息:
  1. v2.4.6 h1:HGkGICFGvyrodcqOOclHKfvJC0qTU7vny/7FhYp9hNw=
即为安装成功!

从零完成 HTTPS 站点

Caddy2—开源 Web 服务器 - 图5

下面将演示如何通过 Caddy 完成 HTTPS 站点。只需要 4 步: Tips 例子用的域名为:caddy.hellogithub.com 修改为你的域名即可。 第一步:安装,采用上面介绍的命令安装 第二步:设置域名解析地址,在购买域名的网站设置 如下图:

Caddy2—开源 Web 服务器 - 图6

设置完生效需要几分钟,可通过下面的命令检查是否生效:
  1. curl "https://cloudflare-dns.com/dns-query?name=caddy.hellogithub.com&type=A" -H "accept: application/dns-json"
域名设置生效,返回如下:
  1. {"Status":0,"TC":false,"RD":true,"RA":true,"AD":false,"CD":false,"Question":[{"name":"caddy.hellogithub.com","type":1}],"Answer":[{"name":"caddy.hellogithub.com","type":1,"TTL":592,"data":"107.150.122.176"}]}
第三步:创建配置文件 Caddyfile,无需额外的开启 HTTPS 的设置:
  1. caddy.hellogithub.com
  2. respond "Hello HTTPS!"
  1. 域名
  2. 访问返回的内容
第四步:启动,在同一目录下执行命令
  1. sudo caddy run

Caddy2—开源 Web 服务器 - 图7

Caddy 默认使用执行命令目录下的 Caddyfile 文件内的配置。 最后,访问 caddy.hellogithub.com 检验效果吧!

Caddy2—开源 Web 服务器 - 图8

这里将从 Caddy 常用命令开始,再到配置讲解,最后会通过一个实际案例来展示如何用 Caddy 配置网站和上线。

常用命令

Caddy2—开源 Web 服务器 - 图9

配置文件

Caddy 的原生配置文件使用的是 JSON 格式。但是为了用户编写方便它提供了 Caddyfile 作为接口让用户可以快速配置站点信息,运行时 Caddy 会自动将 Caddyfile 的配置信息转为 JSON 配置文件。 Caddyfile 所能提供功能不如 JSON 配置文件强大,但是对于不需要复杂配置的用户而言完全够用了。 Caddyfile 的配置指令格式如下:
  1. directive [<matcher>] <args...> { # matcher 代表匹配器,如果提供则该指令将只对 matcher 描述的资源进行响应
  2. subdirective [<args...>] # 子指令
  3. }
Caddyfile 的文件结构如图所示:

Caddy2—开源 Web 服务器 - 图10

下表是对应的关键字和解释,对照上图学习可以加深理解。

关键字 解释 使用
Global options block 服务器全局配置 可用于配置是否启用HTTPS和Admin API等
Snippet 可以复用的配置片段 定义好后认可以通过import关键字引用
Site Block 单个网站配置 通过file_server可以配置静态代理,通过reverse_proxy可以配置动态代理
Matcher definition 匹配定义 默认情况下指令会产生全局影响,通过它可以指定影响范围
Comment 注释 使用#符号开头
Site address 网站地址 默认使用HTTPS,如需开启HTTP,需要指定http://开头
Directive 指令 指令赋予了Caddy强大的功能

演示

下面将演示如何用 Caddy 搭建站点,加深理解配置格式和命令使用。 目录结构:
  1. .
  2. ├── Caddyfile
  3. ├── index.html
  4. └── public
  5. └── HG.html
两个页面文件 index.htmlHG.html 的内容如下:
  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Hello World!</title>
  7. </head>
  8. <body>
  9. 你好,世界!
  10. </body>
  11. </html>
  12. <!-- HG.html -->
  13. <!DOCTYPE html>
  14. <html lang="en">
  15. <head>
  16. <meta charset="UTF-8">
  17. <title>HelloGitHub</title>
  18. </head>
  19. <body>
  20. HelloGitHub
  21. </body>
  22. </html>
Caddyfile 配置内容如下:
  1. # 如果本机没有 wordpress 则注释这一块儿的站点配置
  2. #:80 { # 部署一个 wordpress 站点
  3. # root * /var/www/wordpress
  4. # php_fastcgi unix//run/php/php-version-fpm.sock # 配置一个 fastcig 服务
  5. # file_server # 配置一个文件服务
  6. #}
  7. http://localhost:3000 {
  8. basicauth /public/* {
  9. # 匹配访问 localhost:3000/public/* 的请求,为其加上登陆保护
  10. HG JDJhJDE0JGEySk9janFMdHlBY2Y0aVdQZklQak9HcmwzNDZhNFg0N3V5Ny9EZkZMZHB1Nkt4ZE5BNGJt
  11. # 用户名 HG 密码 HelloGitHub,密码使用 caddy hash-passowrd 指令生成
  12. }
  13. root * ./ # 设置当前站点根目录为当前文件夹,* 表示匹配所有的 request
  14. templates
  15. file_server {
  16. # 配置当前站点为静态文件服务器,可用于博客系统的搭建
  17. hide .git # 隐藏所有的 .git 文件
  18. }
  19. }
  20. :4000 {
  21. reverse_proxy /public/* http://localhost:3000 # 配置反向代理
  22. # 只会匹配 locahost:4000/public 的请求,转发到 localhost:3000/public/
  23. }
在当前目录输入:
  1. $ caddy run # 启动 Caddy
最后,效果如下:
  1. 访问:http://localhost:3000 可以看到页面展示 “你好,世界!”
  2. 访问:http://localhost:3000/public/HG.html 提示输入用户名和密码,验证正确后才能看到页面。
  3. 访问:http://localhost:4000 则会自动跳转到端口 3000 的页面

Caddy的使用

静态代理

<font style="color:rgb(40, 202, 113);background-color:rgb(251, 249, 253);">静态代理</font>就是将请求代理到静态资源上去,这里对<font style="color:rgb(40, 202, 113);background-color:rgb(251, 249, 253);">localhost</font>的请求代理到前端项目中。

  • 将前端项目上传到<font style="color:rgb(40, 202, 113);">/srv</font>目录下;
  • 然后修改Caddyfile中的配置,再使用<font style="color:rgb(40, 202, 113);">caddy reload</font>命令重启下Caddy服务;
  1. http://localhost {
  2. root * /srv/mall
  3. file_server browse
  4. }

动态代理

<font style="color:rgb(40, 202, 113);background-color:rgb(251, 249, 253);">动态代理</font>就是把代理服务器的请求转发到另一个服务上去,这里把对<font style="color:rgb(40, 202, 113);background-color:rgb(251, 249, 253);">api.localhost</font>的请求代理到演示环境的API服务上去。

  • 然后修改Caddyfile中的配置,再使用<font style="color:rgb(40, 202, 113);">caddy reload</font>命令重启下Caddy服务;
  1. http://api.localhost {
  2. reverse_proxy http://admin-api.localhost
  3. }

按目录划分

有时候需要通过同一个域名的不同子目录来访问不同的前端项目,比如通过<font style="color:rgb(40, 202, 113);background-color:rgb(251, 249, 253);">/admin</font>目录访问后台管理系统,通过<font style="color:rgb(40, 202, 113);background-color:rgb(251, 249, 253);">/app</font>目录访问前台系统。

  • 此时可以对目录进行如下划分;
  1. mall.localhost/admin #访问mall后台管理系统
  2. mall.localhost/app #访问mall前台商城系统
  • 这里先把前端项目上传到<font style="color:rgb(40, 202, 113);">/srv/</font>目录下;
  • 修改Caddyfile中的配置,然后重启下Caddy容器;
  1. http://mall.localhost {
  2. route /admin/* {
  3. uri strip_prefix /admin
  4. file_server {
  5. root /srv/admin
  6. }
  7. }
  8. route /app/* {
  9. uri strip_prefix /app
  10. file_server {
  11. root /srv/app
  12. }
  13. }
  14. }

文件压缩

如果服务器带宽比较低,网站访问速度会很慢,这时可以通过让Caddy开启Gzip压缩来提高网站的访问速度。

修改Caddyfile中的配置,使用<font style="color:rgb(40, 202, 113);">encode</font>指令开启Gzip压缩,修改完成后重启Caddy服务;
  1. http://mall.localhost {
  2. root * /srv/mall
  3. encode {
  4. gzip
  5. }
  6. file_server browse
  7. }

地址重写

有的时候网站更换了域名,但还有用户在使用老的域名访问,这时可以通过Caddy的地址重写功能来让用户跳转到新的域名进行访问。

修改Caddyfile中的配置,使用<font style="color:rgb(40, 202, 113);">redir</font>指令重写地址,修改完成后重启Caddy服务;
  1. http://mall.localhost {
  2. redir https://www.localhost
  3. }

接口管理方式

Caddy 除了简单易懂的配置文件方式,还提供了管理配置的接口。通过这些接口可以轻松实现 Web 服务器管理自动化、集成发布等高级功能。

Caddy2—开源 Web 服务器 - 图11

提供的接口和功能:
  • POST /load 设置或替换活动配置
  • POST /stop 停止活动配置并退出进程
  • GET /config/[path] 导出指定路径的配置
  • POST /config/[path] 设置或替换对象;追加到数组
  • PUT /config/[path] 创建新对象或插入数组
  • PATCH /config/[path] 替换现有对象或数组元素
  • DELETE /config/[path] 删除指定路径的值
  • 在 JSON 中使用@id 轻松遍历配置结构
  • GET /reverse_proxy/upstreams 返回配置的代理上游的当前状态