本项目旨在使用 Go 语言重新实现 Nginx 的核心功能,创建一个高性能的事件驱动型 HTTP 服务器和反向代理服务器。项目代号:NginxGo。
- 高性能: 事件驱动架构,支持数万并发连接
- 低资源消耗: 优化的内存管理,高效的 CPU 利用率
- 模块化设计: 插件式架构,便于功能扩展
- 配置兼容: 保持与 Nginx 配置语法的高度兼容
- 热重载: 支持零停机配置更新
┌─────────────────────────────────────────────────────────────────┐
│ NginxGo 系统架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────────────────────────────┐ │
│ │ Master │ │ Worker 进程 │ │
│ │ Process │ │ ┌─────────────────────────────────┐ │ │
│ │ │ │ │ Event Loop (epoll) │ │ │
│ │ - 配置解析 │ │ │ ┌─────────┐ ┌─────────┐ │ │ │
│ │ - 进程管理 │ │ │ │ Conn 1 │ │ Conn N │ │ │ │
│ │ - 信号处理 │ │ │ └────┬────┘ └────┬────┘ │ │ │
│ │ - 日志管理 │ │ └──────┼────────────┼───────────┘ │ │
│ │ - 热重载 │ │ │ │ │ │
│ └──────┬──────┘ │ ┌─────┴────────────┴─────────┐ │ │
│ │ │ │ HTTP 处理管道 │ │ │
│ └───────────┼───▶│ 路由 → 过滤 → 处理器 │ │ │
│ │ └────────────────────────────┘ │ │
│ └───────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────────────────┤
│ 共享层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 配置 │ │ 模块 │ │ 连接池 │ │ 内存池 │ │
│ │ 管理 │ │ 系统 │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘
| 进程类型 |
数量 |
职责 |
| Master |
1 |
配置管理、进程监控、信号处理、热重载 |
| Worker |
N (CPU核数) |
请求处理、事件循环、连接管理 |
┌─────────────────────────────────────────────────────────────┐
│ 模块系统架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Core Module (核心) │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ 配置解析 │ │ 进程管理 │ │ 信号处理 │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────┼────────────────────────────────┐ │
│ │ Event Module (事件层) │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ epoll/kqueue │ │ Timer │ │ Connection │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────┼────────────────────────────────┐ │
│ │ HTTP Module (应用层) │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ Router │ │ Handlers │ │ Filters │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Upstream Module (上游) │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ 负载均衡 │ │ 健康检查 │ │ 连接池 │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
- 配置解析器: 支持 Nginx 风格配置语法
- 进程管理器: Master/Worker 进程生命周期管理
- 信号处理器: 处理系统信号(TERM, HUP, USR1 等)
- 日志系统: 多级别日志输出
- 事件循环: 基于 epoll/kqueue 的事件驱动
- 连接管理: 连接池管理,复用连接资源
- 定时器管理: 支持高精度定时任务
- 路由器: URL 到处理器的映射
- 请求解析: HTTP 头部、正文解析
- 处理器: 静态文件、反向代理、FastCGI 等
- 过滤器: Gzip 压缩、缓存控制等
- 负载均衡: 轮询、最少连接、IP Hash
- 健康检查: 上游服务器状态检测
- 连接池: 上游连接复用
type Cycle struct {
ConfigContext []interface{} // 配置上下文数组
Modules []Module // 已注册模块
Connections []*Connection // 连接池
Listening []*Listener // 监听套接字
Logger *Logger // 日志实例
MemoryPool *sync.Pool // 内存池
}
type Connection struct {
FD int // 文件描述符
RemoteAddr string // 客户端地址
LocalAddr string // 服务器地址
ReadEvent *Event // 读事件
WriteEvent *Event // 写事件
Request *Request // 当前请求
Server *Server // 所属服务器
}
type Request struct {
Method string // HTTP 方法
URI string // 请求 URI
Proto string // 协议版本
Headers map[string]string // 请求头
Body []byte // 请求体
Connection *Connection // 关联连接
}
type Server struct {
Name string // 服务器名称
Addresses []string // 监听地址
Locations []*Location // Location 配置
Upstreams map[string]*Upstream // 上游服务器组
}
type Event struct {
Handler func() // 回调处理函数
Timer *time.Timer // 定时器
Active bool // 活跃状态
Read bool // 可读标志
Write bool // 可写标志
}
// 模块接口
type Module interface {
Name() string // 模块名称
Type() ModuleType // 模块类型
Init(cycle *Cycle) error // 初始化
PostInit(cycle *Cycle) error // 后初始化
}
// 模块类型
type ModuleType int
const (
TypeCore ModuleType = iota
TypeEvent
TypeHTTP
TypeUpstream
TypeStream
TypeMail
)
type HTTPHandler interface {
ServeHTTP(w ResponseWriter, r *Request)
}
// 处理器注册
type HandlerRegistry struct {
Handlers map[string]HTTPHandler
}
type HTTPFilter interface {
Filter(w ResponseWriter, r *Request) error
}
// 过滤器链
type FilterChain struct {
Filters []HTTPFilter
}
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 读取配置 │───▶│ 词法分析 │───▶│ 语法分析 │───▶│ 构建对象 │
│ 文件 │ │ (Tokenize)│ │ (Parse) │ │ (Build) │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
type Config struct {
Global GlobalConfig // 全局配置
Events EventConfig // 事件配置
HTTP HTTPConfig // HTTP 配置
Stream StreamConfig // 流配置
}
type GlobalConfig struct {
WorkerProcesses int // Worker 进程数
WorkerCPUAffinity bool // CPU 亲和
ErrorLog string // 错误日志路径
PIDFile string // PID 文件路径
}
type HTTPConfig struct {
Servers []*ServerConfig // 服务器配置
Upstreams []*UpstreamConfig // 上游配置
}
开始
│
▼
┌─────────────────┐
│ epoll_wait │◀─────────────┐
│ (阻塞等待) │ │
└────────┬────────┘ │
│ 有事件 │
▼ │
┌────────────┐ │
│ 处理就绪事件 │ │
└─────┬──────┘ │
│ │
▼ │
┌────────────┐ │
│ 分发到 │──────────────┤
│ 处理器 │
└────────────┘
│
▼
┌────────────┐
│ 处理完成 │
│ 返回 epoll │
└────────────┘
Accept (接受连接) → Register (注册事件) →
Read (读取请求) → Process (处理请求) →
Write (发送响应) → Close (关闭连接)
| 机制 |
用途 |
| Unix Socket |
Master-Worker 通信 |
| Channel |
Go routine 间通信 |
| Shared Memory |
配置共享 |
| 信号 |
动作 |
| SIGTERM/SIGINT |
快速停止服务 |
| SIGQUIT |
优雅停止服务 |
| SIGHUP |
重新加载配置 |
| SIGUSR1 |
重新打开日志 |
| SIGUSR2 |
平滑升级 |
// 模块注册
var modules = make(map[string]Module)
func RegisterModule(m Module) {
modules[m.Name()] = m
}
// 内置处理器
var builtInHandlers = map[string]func() HTTPHandler{
"static": NewStaticHandler,
"proxy": NewProxyHandler,
"fastcgi": NewFastCGIHandler,
"uwsgi": NewUWSGIHandler,
}
- 连接池预分配,避免运行时分配
- 对象池复用,减少 GC 压力
- 减少内存碎片
- TCP 零拷贝
- TCP_NOPUSH/TCP_NODELAY
- 连接复用
- Master/Worker 进程模型
- 事件循环 (epoll)
- 基础 HTTP 处理
- 支持 Nginx 配置语法
- 支持常见 Nginx 指令
- 平滑迁移
- 兼容 Nginx 模块 API
- 支持第三方模块移植