caddy 模块(module) caddyhttp Start启动逻辑分析

 

./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的特殊处理,以及日志和错误管理,展示了高度灵活和可配置的服务器管理逻辑。

 

Link:https://www.cnblogs.com/farwish/p/18259674

posted on 2024-06-22 13:50  ercom  阅读(7)  评论(0编辑  收藏  举报