Caddy Server

Caddy Server

Caddy 使用简介
官网 https://caddyserver.com/

功能模块介绍

  • Caddy 是用Go 写的一个webServer
  • 集成 Let’s Encrypt 自动签发证书
  • 内置 支持Http/2
  • 内置 支持 TLS 1.3
  • 配置简单容易上手
    还有其他的看功能看 文档把

Caddy 的授权模式

在 github 作者源码上编译版本是 免费的

https://github.com/mholt/caddy

在下面 官网 通过在线自动编译 出来的 caddy 版本 个人使用免费 商用需要订阅收费

https://caddyserver.com/download

下面示例 使用 Caddy 1.0 windows 版本 反向代理 .net core 2.2 kestrel webapps

先从 caddy-releases 下载windows 编译版本二进制文件

解压缩到 本地目录

新建一个 website目录 存放 Caddyfile 配置文件
这里 比如 是这样的目录结构

E:\website\hangfire.18080\Caddyfile

E:\caddy_v1.0.0_windows_amd64\caddy.exe

运行 CMD

E:\caddy_v1.0.0_windows_amd64\caddy.exe -conf E:\website\hangfire.18080\Caddyfile

示例 Caddyfile 配置文件 具体更详细的看官方 文档

yourdomain:18080  //主机地址
tls off  //关闭 证书 自动申请 自动申请需要 80 443 端口开放
basicauth /hangfire user pwd  //配置 简单登陆验证
proxy / localhost:5100  //反代 本地 kestrel webapps

这样 一个 Caddy 网站示例 已经能正常运行了。

配置守护进程

因为 Caddy 并没有提供 windows下的服务启动方案 这里 我们通过 nssm 这个工具 实现服务的安装

首先到官网下载 nssm-2.24-101-g897c7ad.zip
把对应版本的 nssm.exe 复制到随意一个目录(我这里把他放到 Caddy.exe 同一目录下)

运行 CMD
切换到 nssm.exe 目录

nssm install [<servicename>]
nssm edit <servicename>


运行上面的目录 会弹出 ui 配置界面 把 caddy 的运行参数 配置添入后就能在 windows 服务中 看见你安装的服务了 然后我们配置 延迟启动 这样 如果机器重启 或者服务崩溃 就有守护进程帮你自动重启服务了。

Caddy proxy asp.net core 3 kestrel grpc webapp

Caddy proxy asp.net core 3 kestrel grpc webapp

开发环境

Caddy Server

caddy_v1.0.0_windows_amd64

.net core 3

dotnet-sdk-3.0.100-preview4-011223-win-x64

openssl

Win64OpenSSL-1_1_0j.exe

system win 10 pro

结构流程

  • grpc on kestrel server https://localhost:50051
  • grpc client request call grpc on caddy proxy https://localhost:8080
  • CaddyServer //https://localhost:8080

grpc client(H2-TLS 协议) 访问 –> CaddyServer –> 反向代理(H2-TLS 协议) –> grpc on kestrel server

这里主要记录 部署过程 grpc 项目 使用 标准 模板 helloworld

grpc on kestrel server 配置

运行 vs2019 pre 2 内置的模板创建 一个 .net core grpc 项目
项目创建完成后 你就有一个 跑在 kestrel 上的 grpc server了

CaddyServer Http/2 反代协议 需要 kestrel 跑在 TLS https 下 如果kestrel 跑在http 下 Caddy会自动降级 http1 处理反代协议,所以 我们需要先把 本地 dotnet dev cert 证书 导入kestrel 我们先把

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
//webBuilder.UseUrls("https://localhost:50051")
webBuilder.ConfigureKestrel(options =>
{
options.Limits.MinRequestBodyDataRate = null;
options.Listen(IPAddress.Any, 50051, listenOptions =>
{
listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;

//我们使用ASP.NET核心开发证书
listenOptions.UseHttps();

//或者我们可以使用.pfx格式的自己的证书 X509Certificate2
//listenOptions.UseHttps(cert);
});
});
webBuilder.UseSerilog();
webBuilder.UseStartup<startup>();</startup>

});

这里 grpc kestrel server 已经配置完成 可以通过 vs 拉起 黑屏运行了

CaddyServer 配置

Caddyfile 配置
主要就是加载 pem 证书 配置比较简单 直接贴 Caddyfile 了

https://localhost:8080

tls  ../localhostpubliccert.pem ../localhostprivatekey.pem

proxy / https://localhost:50051 {

}

grpc client 实现

grpc client 需要修改的是 默认Channel 使用了 非 TLS 安全传输访问通道 我们需要 修改成 加载证书的版本

//Channel channel = new Channel(“localhost:50051”, ChannelCredentials.Insecure);

string rootpath = AppDomain.CurrentDomain.BaseDirectory;
var filepath = Path.Combine(rootpath, "localhostdevcert.pem");
string pem = File.ReadAllText(filepath);

SslCredentials secureCredentials = new SslCredentials(pem);
Channel secureChannel = new Channel("localhost", 8080, secureCredentials);

var client = new Greeter.GreeterClient(secureChannel);

openssl 转换 localhsot 开发证书 格式

  • 开发证书安装
    dotnet dev-certs https –trust
  • 通过 MMC 导出 开发证书 保存成 .pfx 二进制的证书文件  
  • .pfx 转换 成 pem 格式的证书

安装 openssl 工具 转换 证书的格式 CaddyServer 需要 pem 格式的证书

证书和私钥

openssl pkcs12 -in d:\localhostdevcert.pfx -out d:\localhostdevcert.pem -nodes

私钥

openssl pkcs12 -in d:\localhostdevcert.pfx -nocerts -out d:\localhostprivatekey.pem -nodes

证书

openssl pkcs12 -in d:\localhostdevcert.pfx -nokeys -out d:\localhostpubliccert.pem -nodes

demo 源码

github rep

ps 引用参考

开发证书

Protocols in ASP .NET Core: HTTPS and HTTP/2