本文档介绍了 Caddy 的网络监听器管理系统,该系统负责处理跨不同协议和网络类型的网络监听器的创建、配置和生命周期。监听器管理系统负责绑定到网络地址、管理监听器池以实现优雅重载,并为 Caddy 中的所有网络通信提供基础。
有关 HTTP 服务器配置和生命周期的信息,请参阅服务器生命周期。有关 TLS 连接处理的信息,请参阅连接策略。有关连接建立后的请求路由详情,请参阅请求路由。
Caddy 使用 NetworkAddress 结构体以统一的方式表示不同网络类型和协议的网络地址。
NetworkAddress 结构体支持各种网络类型和寻址方案。
| 网络类型 | 地址示例 | 目的 |
|---|---|---|
tcp, tcp4, tcp6 | tcp/localhost:8080 | HTTP/HTTPS 服务器 |
udp, udp4, udp6 | udp/localhost:8080 | HTTP/3 (QUIC) 服务器 |
unix, unixpacket, unixgram | unix//var/run/caddy.sock | Unix 域套接字 |
fd, fdgram | fd/3 | 基于文件描述符的监听器 |
来源:listeners.go41-59 listeners.go308-424
Caddy 的监听器创建过程包括解析网络地址、检查插件提供的监听器以及根据网络协议创建适当的监听器类型。
监听器创建过程遵循以下顺序:
来源: modules/caddyhttp/app.go533-561
Caddy 实现了复杂的监听器池系统,以实现在不中断连接的情况下优雅地重新加载配置。该系统允许在过渡期间,多个服务器实例共享相同的网络地址。
该池系统提供了多项关键优势:
来源: listeners.go135-139 listeners.go494-498
Caddy 的 HTTP 应用为每个服务器协调多个协议监听器,处理多协议支持的复杂性。
协议处理的关键方面:
来源:modules/caddyhttp/app.go532-594 modules/caddyhttp/app.go603-628 listeners.go433-492
监听器包装器允许通过模块化系统修改监听器行为。HTTP 服务器支持可配置的监听器包装器,可以转换连接处理。
包装器系统提供了:
caddy.ListenerWrapper 接口 listeners.go692-694tlsPlaceholderWrapper 控制 TLS 定位 modules/caddyhttp/app.go342-361来源:modules/caddyhttp/server.go54-56 modules/caddyhttp/app.go333-362 listeners.go692-694
Caddy 实施了全面的关闭程序,以确保所有监听器和连接的干净终止。
关闭过程包括:
来源:modules/caddyhttp/app.go647-772 modules/caddyhttp/server.go680-685 listeners.go575-580