CaddyServer 反向代理和 HTTPS 的相关使用介绍

本贴最后更新于 1712 天前,其中的信息可能已经时过境迁

CaddyServer 反向代理和 HTTPS 的相关使用介绍

把 2 月份写的一个说明文档翻了出来,在博客上发表备份一下。

一、Caddy 基本信息介绍

1. 官方介绍:

Caddy 是具有自动 HTTPS 的 HTTP/2 Web 服务器(使用 Golang 开发) 。

其他 Web 服务是专为 Web 设计的,但 Caddy 是专为人类设计的,并兼顾了当今的 Web。

2. 特性说明:

✔ 静态文件

默认情况下,Caddy 在当前工作目录中提供静态文件服务。它非常简单,工作速度快。

✔ 动态网站

Caddy 还可用于通过模板、代理、FastCGI 和插件使用动态站点。

✔ 配置简单

Caddyfile,一种简单,直观的配置站点的方法。它不是脚本,也不难记忆。

✔ 零停机时间重载

在进行配置更改后,使用 USR1 信号在 Unix 系统上正常重新加载 Caddy,停机时间为零。

✔ 可扩展核心

可以通过插件扩展。所有服务器类型、指令、DNS 提供程序和更多功能都是插件!它们很容易编写并直接编译。

✔ 自动 TLS

唯一默认使用 HTTPS 的 Web 服务器。具有现代协议的强化 TLS 堆栈可保护隐私并暴露 MITM 攻击。

✔ 跨平台使用

支持 Windows、macOS、Linux、BSD、Android、Solaris、32-bit、x64、ARM、mips64 ......

✔ 使用多核 CPU

当任务变得艰难时,Caddy 开始使用更多的 CPU。Go 的调度程序理解 Go 代码,而 goroutine 比系统线程更轻量级,所以它很快。

✔ 负载均衡

使用您选择的负载平衡策略代理到多个后端:随机(默认)、最少连接、循环、IP 哈希或请求头等等。

3. 下载 Caddy:

① 直接下载:

通过浏览器访问 https://caddyserver.com/download 选择系统平台、插件等构建内容后直接点击下载按钮获取 Caddy 的二进制运行文件压缩包。

② 一键安装:

Unix 系统通过终端运行命令 curl https://getcaddy.com | bash -s personal

  • macOS 中也可在终端中使用命令 brew install caddy 进行安装。

4. 运行 Caddy:

Windows 系统下可直接双击 caddy.exe 运行,也可像 Unix 系统一样使用命令运行:

./caddy --conf  Caddyfile

二、Caddy 自动 HTTPS 的使用

1. Caddyfile:

在这之前,首先需要了解一下 Caddyfile
Caddyfile 是 Caddy 服务的配置文件,作用相当于 Nginx 的 nginx.conf,此文件一般放在 Caddy 二进制文件的同级目录,直接通过命令 ./caddy 即可运行,也可放于任意目录,但运行时需要通过参数 --conf 来设置文件的路径,如:
./caddy --conf ../Caddyfile

2. 一个简单的 Caddyfile 示例:

example.com, www.example.com, 127.0.0.1 {
  gzip
  root /www/example.com
  log ../log/access.log
}

3. 启用自动 HTTPS:

启用 HTTPS 的前提,首先是需要是有一台云服务器(IP 开放 80 端口),然后要确保系统的 80 和 443 端口未被其他程序占用。

以上述 Caddyfile 为基础,修改 Caddyfile 配置:

example.com, www.example.com, 127.0.0.1 {
  gzip
  root /www/example.com
  log ../log/access_tls.log

  tls  seves@zxzx.ltd
}

以上配置通过 tls 命令 + email 启用自动 HTTPS,无需手动更新证书,此命令不是必须的。其中 email 用于生成具有可信 CA 的证书的电子邮件地址,这样就不用在启动时去输入了。

  • 参考资料
  1. https://dengxiaolong.com/caddy/zh/automatic-https.html
  2. https://dengxiaolong.com/caddy/zh/tls.html

4. 默认启用自动 HTTPS:

https://example.com, www.example.com, otherdomain.com {
  gzip
  root /www/example.com
  log ../log/access_https.log

  # 配置 301 重定向,访问顶级域名时自动跳转到 www 二级域名
  redir  301 {
    if {host} is example.com
    / https://www.{host}{uri}
  }

  header / {
    # 配置 HSTS(HTTP严格安全传输)
    Strict-Transport-Security "max-age=31536000;includeSubdomains;preload"
  }
}

在此处未使用 tls 命令,也是默认启用了 HTTPS 的,因为在开头的域名前指定了访问协议为 https://
redir 命令用于配置重定向,后面的数字是返回给客户端的重定向 HTTP 状态码,如 301302 等,相当于 Nginx 的 redirect 命令。
在这里还添加了一个响应头 Strict-Transport-Security,作用是如果浏览器是通过 HTTP 协议访问则自动转为用 HTTPS 协议进行访问,进一步增强安全性。

三、Caddy 反向代理服务的使用

反向代理
在计算机网络中,反向代理是代理服务器的一种。服务器根据客户端的请求,从其关系的一组或多组后端服务器(如 Web 服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的 IP 地址,而不知道在代理服务器后面的服务器簇的存在。
简单说明一下概念,内容来源于百度百科,更详细的内容请自行搜索了解。

负载均衡

反向代理可结合负载均衡使用,但负载均衡不是本次讲解的重点,简单说明一下策略,有以下几种负载均衡策略可用:

  1. random(default):随机选择一个后端地址
  2. least_conn:选择活动连接最少的后端
  3. round_robin:以循环方式选择后端
  4. first:按照在 Caddyfile 中定义的顺序选择第一个可用后端
  5. ip_hash:通过散列请求 IP 选择后端,根据后端总数在散列空间中均匀分布
  6. uri_hash:通过散列请求 URI 选择后端,根据后端总数在散列空间中均匀分布
  7. header:通过散列指定头的值(由策略名后面的 [value] 指定)进行选择,根据后端总数在散列空间中均匀分布
graph RL User1((客户端 1)) User2((客户端 2)) User3((客户端 3)) User1 --请求 1--> CaddyServer User2 --请求 2--> CaddyServer User3 --请求 3--> CaddyServer CaddyServer -.响应 1.-> User1 CaddyServer -.响应 2.-> User2 CaddyServer -.响应 3.-> User3 subgraph 反向代理 + 负载均衡 CaddyServer end subgraph 后台服务 WebServer1 WebServer2 WebServer3 end WebServer1 --连接 1--- CaddyServer WebServer2 --连接 2--- CaddyServer WebServer3 --连接 3--- CaddyServer title>反向代理和负载均衡示意图]

1. 反向代理相关配置:

https://example.com, https://www.example.com {
  gzip 
  log ../log/access_proxy.log
  header / {
      Strict-Transport-Security "max-age=31536000;includeSubdomains;preload"
  }
  ## HTTP 代理配置
  ### 此时访问 example.com,实际访问的是 127.0.0.1:8080/app/ 的内容
  proxy / 127.0.0.1:8080/app/

  ## WebSocket 代理配置
  ### 客户端请求的 wss://example.com/app/websocket, 实际为 wss://127.0.0.1:8080/app/websocket
  proxy /app/websocket 127.0.0.1:8080 {
      websocket
  }
}

此处第一个 proxy 命令的作用是,将 127.0.0.1:8080/app/ 的内容反向代理到 example.com,这样客户端就可以通过 HTTPS + 域名 进行访问了。第二个 proxy 命令用于代理同站的 websocket,以启用 WebSocket 安全协议,因为反向代理启用 HTTPS 后,同源 WebSocket 必须使用 wss 协议,否则浏览器会拒绝连接到不安全的 WebSocket。

2. 负载均衡简单配置(了解):

proxy / web1.local:80 web2.local:90 web3.local:100 { 
  policy round_robin 
}

用反向代理命令 proxy 将请求循环转发到 80、90、100 三个后端服务,通过 policy 命令控制策略为 round_robin,以循环方式选择后端服务。

四、Caddy 与 Nginx 的简单对比

项目 Caddy Nginx
入门难度 简单 较难
配置语法 简洁 复杂
功能扩展 支持,目前相对较少 支持,扩展较多且相对稳定
自动 HTTPS 默认支持,配置简单 默认不支持,配置较难
多核 CPU 支持 支持
跨平台使用 几乎支持市面上所有已知系统 大多数操作系统
处理性能 性能较高,尤其是反向代理方面 性能高,系统资源占用率低
负载均衡 支持 支持

总而言之就是各有优缺,Nginx 强大而复杂,Caddy 先进而简约,但在某些方尚且面略逊一筹。由于 Nginx 起步较早且用 C 语言开发,故在底层上决定了其某些方面的性能比用 Go 语言开发的年轻 Caddy 相对更高一些,引用一句话就是:

如果说 Nginx 是成功中年人士,则 Caddy 是年轻高富帅。

参考资料:

  1. 官方网站:https://caddyserver.com/
  2. 第三方中文文档:https://dengxiaolong.com/caddy/zh/
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 131 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 38 关注
  • HTTPS
    98 引用 • 271 回帖 • 3 关注
  • 反向代理
    9 引用 • 38 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    非常感谢,真的帮到我了!