./modules/caddyhttp/app.go
func (app *App) Start() error { // xx }
Start 方法属于一个自定义的 App 结构体,用于启动应用程序中的多个 HTTP 服务器实例。
下面是对该方法的主要逻辑和关键步骤的详细分析:
1. 日志设置:
首先,通过 zap.NewStdLogAt 创建一个兼容 http.Server 的日志记录器,级别设为 DebugLevel,用于记录服务器日志。
2. 服务器配置循环:
使用 range 遍历 app.Servers,对每个服务器(srv)进行配置。
创建 http.Server 实例,并根据 srv 配置项设置读写超时、最大头大小、处理器(Handler)、错误日志、连接上下文等。
根据服务器配置决定是否启用 HTTP/2 (h2),如果禁用,则清除与 HTTP/2 相关的配置;如果启用,则使用 http2.ConfigureServer 配置 HTTP/2 服务器。
3. TLS配置与监听地址处理:
从 srv.TLSConnPolicies 获取 TLS 配置,并应用到服务器。
遍历 srv.Listen 中的每个监听地址,解析地址,创建监听器,并考虑端口范围。
根据配置动态开启或关闭 TLS 支持,以及 HTTP/3 (h3)支持。
对监听器应用一系列包装器(listenerWrappers),这些包装器可以包括 TLS 包装、HTTP/2 特定的包装等,以增强或修改基础网络行为。
4. 协议支持与启动服务:
根据服务器支持的协议(h1, h2c, h3),决定如何最终配置服务器的处理器(例如,使用 HTTP/2 的 h2c 处理器)。
对于每个监听器,如果配置了 HTTP/1 (h1),则启动一个新的 goroutine 来运行 http.Server.Serve(ln),监听并处理请求。
5. 自动 HTTPS 和日志记录:
在所有服务器配置完毕后,调用 app.automaticHTTPSPhase2() 完成自动 HTTPS 证书管理的第二阶段。
最后,记录每个服务器已启动的信息,包括名称和所支持的协议。
整体而言,这个方法非常详尽地处理了 HTTP 服务器的配置与启动流程,包括对不同协议的支持、TLS加密、HTTP/2和HTTP/3的特殊处理,以及日志和错误管理,展示了高度灵活和可配置的服务器管理逻辑。
在线JSON编辑器
代码差异对比神器
二维码在线实时生成
Link:https://www.cnblogs.com/farwish/p/18259674