HOW- Caddy - 自动 HTTPS 和现代协议支持

一、背景

我们可能在开发中遇到如下问题:

场景一

  1. 本地前端起了服务,在浏览器可通过 localhost:8080 访问。
  2. 请求后端服务业务域名的接口正常,因为做了跨域配置
  3. 但访问一些内部公共服务,如 FMS、CDN 服务时,访问其域名的接口,访问失败

失败原因:请求跨域设置不允许 localhost,而是 *.company.com 等通用域名,且要求为 https 协议。

场景二

开发环境登录时,需要使用 SSO 的 Cookie,但是受到跨域限制,需要本地模拟一个 https 协议的域名。

二、解决方案:caddy

Caddy 是一个开源的 HTTP/2 和 HTTP/3 服务器,具有自动 HTTPS 功能。它非常适合需要简便、安全地托管网站的用户。

Caddy 的主要特点包括:

  1. 自动 HTTPS:Caddy 自动为你的站点获取并续订 TLS 证书。
  2. 简洁的配置:使用简单的配置文件(Caddyfile)配置站点。
  3. 现代协议支持:支持 HTTP/2 和 HTTP/3 协议。
  4. 插件系统:Caddy 支持各种插件,扩展功能和灵活性。
  5. 跨平台:支持 Linux、Mac、Windows 等多种操作系统。

以下是 Caddy 的一些基本用法和配置示例:

2.1 安装 Caddy

你可以通过多种方式安装 Caddy,包括从源代码构建、使用包管理器或下载预构建的二进制文件。

具体安装文档

2.2 基本配置(Caddyfile)

Caddy 使用一个名为 Caddyfile 的配置文件来定义站点配置。以下是一个简单的 Caddyfile 示例:

example.com {
    root * /var/www/html
    file_server
    encode gzip
    log {
        output file /var/log/caddy/access.log
    }
}

在这个示例中:

  • example.com 是你的域名。
  • root * /var/www/html 设置网站根目录。
  • file_server 启用文件服务器功能,提供静态文件。
  • encode gzip 启用 gzip 压缩。
  • log 配置访问日志记录。

2.3 启动 Caddy

配置完成后,可以使用以下命令启动 Caddy:

sudo systemctl start caddy
sudo systemctl enable caddy

2.4 使用插件

Caddy 有丰富的插件系统,可以扩展其功能。

例如,使用 http.jwt 插件进行 JWT 身份验证:

example.com {
    route {
        jwt {
            primary yes
            trusted_public_key /path/to/public.key HS256
        }
        reverse_proxy localhost:3000
    }
}

2.5 自动 HTTPS

Caddy 会自动获取和续订 TLS 证书,这使得配置 HTTPS 非常简单。你只需确保域名指向服务器的 IP 地址,并在 Caddyfile 中使用域名,Caddy 会自动处理证书的获取和续订。

三、Caddy 作为反向代理

3.1 基本使用

Caddy 也可以作为反向代理来处理传入的请求并将其转发到其他服务器:

example.com {
    reverse_proxy /api/* localhost:8080
    reverse_proxy /assets/* localhost:9090
}

在这个示例中:

  • 请求 /api/* 会被转发到 localhost:8080
  • 请求 /assets/* 会被转发到 localhost:9090

3.2 localhost 请求跨域问题解决

  1. 本地前端起了服务,在浏览器可通过 localhost:8080 访问
  2. 安装 Caddy,接着在项目根目录新建文件 Caddyfile
local.company.com {
  reverse_proxy localhost:8080
  tls internal
}
  1. /etc/hosts 指定一个域名,比如 local 到本地
127.0.0.1 local.company.com
  1. 然后在当前路径执行 caddy run生成一个自签名的证书
  2. 重新启动前端服务
  3. 在浏览器 https://local.company.com 应该就可以正常访问通用服务接口

3.3 FAQ

1. ERR_TUNNEL_CONNECTION_FAILED 错误

有时候我们本机网络代理中 网页代理(HTTP) 和 安全网页代理(HTTPS) 挂着公司代理的情况时,会遇到这个报错,如:

  1. 打开本机代理设置
  2. 网页代理(HTTP) 配置:服务器 proxy.company.com,端口 8080
  3. 安全网页代理(HTTPS) 配置:服务器 proxy.company.com,端口 8080

因为 DNS 解析从公司代理找不到 /etc/hosts 里定义的地址。

如果确认是代理的原因,代理规则里设置忽略 *.company.com 可以解决。

2. Vite WebSocket 另外指定了端口的问题

在 vite 项目中,启动时会发现网页持续刷新。排查后发现是因为 vite 内部 hmr 功能重新自定义了 ws 端口,导致页面一直刷新。

但是 Caddy 转 Secure WebSocket 的配置暂缺,目前需要一个手动配置让 Vite WebSocket 直接走 HTTP,注意端口号要配置两个地方:

// vite.config.js
export default {
  server: {
    // 本地调试场景下用于用于覆盖 vite hmr 配置
    hmr: {
      protocol: "ws",
      host: "localhost",
      port: 20001, // 可以自己选择一个合适的端口, 比如 5173
      clientPort: 20001,
    }
  }
}

四、总结

Caddy 是一个强大且易于使用的 Web 服务器,特别适合需要自动 HTTPS 和现代协议支持的场景。它的简洁配置和插件系统使其非常灵活,可以满足各种不同的需求。你可以通过其官方文档了解更多详细信息和高级配置选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值