docs: update code statistics and simplify README structure

- Update stats: 234 source files, 242 test files, ~189K lines, 81.3% coverage
- Remove GeoIP filter from feature list
- Simplify directory structure section
- Remove redundant diagrams and detailed module breakdowns
- Streamline monitoring and deployment sections

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
xfy 2026-05-09 15:36:39 +08:00
parent 9c091e528b
commit 81df41b817

399
README.md
View File

@ -7,7 +7,7 @@
基于 [fasthttp](https://github.com/valyala/fasthttp) 构建,提供比标准 net/http 更高的性能。支持 HTTP/3 (QUIC)、WebSocket、虚拟主机、多种负载均衡算法、故障转移、代理缓存、Lua 脚本扩展,以及完整的安全与性能优化特性。
> **代码统计**174 个源文件 | 158 个测试文件 | ~136,000 行 Go 代码 | 测试覆盖率 >80%
> **代码统计**234 个源文件 | 242 个测试文件 | ~189,000 行 Go 代码 | 测试覆盖率 81.3%
## 特性
@ -54,7 +54,6 @@ proxy:
### 安全
- **访问控制** - IP/CIDR 白名单与黑名单,支持 trusted_proxies 配置
- **GeoIP 过滤** - 基于 MaxMind GeoIP2 数据库的国家/地区访问控制
- **速率限制** - 令牌桶与滑动窗口算法,支持精确/近似模式
- **连接限制** - 单 IP 并发连接数限制
- **认证** - Basic Auth支持 bcrypt 与 argon2id外部 auth_request 子请求
@ -187,238 +186,28 @@ lolly 支持将 nginx 配置文件转换为 YAML 格式:
+---------+ +-----------+ +---------+
```
### 核心模块依赖关系
```
main.go (CLI 入口)
│ app.Run()
┌─────────────────────────────────────────────────────────────────┐
│ App (app/) │
│ 生命周期: loadConfig → initServer → Start → handleSignal │
│ 组合: Server + HTTP3Server + HTTP2Server + StreamServer │
└─────────────────────────────┬───────────────────────────────────┘
┌───────────────────────┼───────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────┐ ┌──────────────┐ ┌───────────┐
│ config │ │ server │ │ upgrade │
│ (YAML) │ │ (HTTP) │ │ (热升级) │
│ 18 文件 │ │ GoroutinePool│ │ FD 继承 │
└─────┬─────┘ └─────┬────────┘ └───────────┘
│ │
│ ▼
│ ┌───────────────────────────────────────┐
│ │ Middleware Chain │
│ │ AccessLog → Security → Compression │
│ │ → BodyLimit → Rewrite → Lua │
│ └─────┬─────────────────────────────────┘
│ │
│ ▼
│ ┌───────────┐
│ │ matcher │
│ │ (Location)│
│ │ Radix Tree│
│ └─────┬─────┘
│ │
│ ┌───────────┴───────────┐
│ │ │
│ ▼ ▼
│ ┌───────────┐ ┌───────────┐
│ │ handler │ │ proxy │
│ │ (Static) │ │ (反向代理)│
│ │ sendfile │ │ HostClient│
│ └─────┬─────┘ └─────┬─────┘
│ │ │
│ ▼ ▼
│ ┌───────────┐ ┌───────────┐
│ │ cache │ │loadbalance│
│ │ FileCache │ │ 7 种算法 │
│ └───────────┘ └─────┬─────┘
│ │
▼ ▼
┌───────────┐ ┌───────────┐
│ logging │ │ resolver │
│ (zerolog) │ │ (DNS) │
└───────────┘ └───────────┘
```
### 设计模式应用
| 模式 | 应用位置 | 说明 |
| ---------- | ------------------------------------- | -------------------------------------------- |
| 策略模式 | `loadbalance/` | 7 种 LB 算法可插拔切换,实现 `Balancer` 接口 |
| 责任链模式 | `middleware/` | 中间件逆序包装链式调用,洋葱模型 |
| 工厂模式 | `proxy/proxy.go` | `createBalancerByName` 根据名称创建均衡器 |
| 对象池模式 | `proxy/headersPool`, `cache/`, `lua/` | `sync.Pool` 复用高频对象 |
| 观察者模式 | `server/upgrade.go` | 信号监听与处理,优雅升级触发 |
### 性能优化设计
| 优化点 | 实现方式 | 收益 |
| -------------- | -------------------- | ---------------------------- |
| fasthttp | 替代 net/http | 零分配请求处理10x 性能提升 |
| sendfile | Linux 内核级传输 | 大文件零拷贝,减少 CPU 开销 |
| sync.Pool | headers/buffers 复用 | 减少 GC 压力 |
| Goroutine Pool | worker 池复用 | 避免 goroutine 爆炸 |
| 原子计数器 | `atomic.AddUint64` | 负载均衡无锁选择 |
| LRU 缓存 | GeoIP/FileCache | 减少重复查询/读取 |
### 目录结构
```
internal/
├── app/ # 应用入口、信号处理、生命周期
│ ├── app.go # 主程序逻辑Start/Stop/Reload
│ ├── app_common.go # 通用平台代码
│ ├── app_windows.go # Windows 平台适配
│ └── import.go # nginx 配置导入
├── config/ # 配置加载、验证、默认值13 文件)
│ ├── config.go # 根配置结构(支持 single/vhost/multi_server 模式)
│ ├── loader.go # 配置文件加载
│ ├── defaults.go # 默认配置
│ ├── validate.go # 配置验证
│ ├── server_config.go # 服务器配置
│ ├── proxy_config.go # 代理配置
│ ├── ssl_config.go # SSL/TLS 配置
│ ├── security_config.go # 安全配置
│ ├── cache_config.go # 缓存配置
│ ├── performance_config.go # 性能配置
│ ├── monitoring_config.go # 监控配置
│ └── variable_config.go # 变量配置
├── server/ # HTTP 服务器核心13 文件)
│ ├── server.go # 服务器实现(三种运行模式)
│ ├── vhost.go # 虚拟主机管理
│ ├── pool.go # Goroutine 池
│ ├── status.go # 状态端点
│ ├── pprof.go # pprof 端点
│ ├── pprof_impl.go # pprof 实现
│ ├── purge.go # 缓存清除端点
│ ├── internal.go # 内部端点处理
│ ├── lifecycle.go # 生命周期管理
│ ├── middleware_builder.go # 中间件构建器
│ ├── init.go # 初始化逻辑
│ ├── router.go # 路由器集成
│ ├── upgrade.go # 热升级管理Unix
│ ├── upgrade_windows.go # 热升级管理Windows
│ └── testutil.go # 测试工具
├── handler/ # 请求处理器
│ ├── router.go # fasthttp/router 封装
│ ├── static.go # 静态文件处理含缓存、ETag、304
│ ├── sendfile.go # 零拷贝传输接口
│ ├── sendfile_linux.go # Linux sendfile 实现
│ ├── sendfile_common.go # 通用实现
│ ├── autoindex.go # 目录列表生成
│ ├── fileinfo_cache.go # FileInfo 缓存
│ └── errorpage.go # 错误页面管理
├── proxy/ # 反向代理
│ ├── proxy.go # 代理核心(负载均衡、缓存、故障转移)
│ ├── websocket.go # WebSocket 代理
│ ├── health.go # 主动健康检查
│ ├── health_match.go # 健康检查匹配逻辑
│ ├── headers.go # 头部处理工具
│ ├── header_modifier.go # 头部修改器
│ ├── redirect_rewrite.go # Location/Refresh 头改写
│ ├── proxy_ssl.go # 上游 SSL/TLS
│ ├── proxy_dns.go # DNS 解析集成
│ ├── target_selector.go # 目标选择器Lua balancer 支持)
│ ├── cache_handler.go # 代理缓存处理
│ ├── tempfile.go # 临时文件管理
│ ├── tempfile_cleaner.go # 临时文件清理
│ ├── utils.go # 工具函数
│ └── validate.go # 配置验证
├── loadbalance/ # 负载均衡算法
│ ├── balancer.go # Balancer 接口、RoundRobin、WeightedRR、LeastConn、IPHash
│ ├── algorithms.go # 算法注册
│ ├── consistent_hash.go # 一致性哈希(虚拟节点)
│ ├── random.go # Power of Two Choices
│ └── slow_start.go # 慢启动算法
├── matcher/ # Location 匹配器
│ ├── matcher.go # 匹配器接口
│ ├── exact.go # 精确匹配
│ ├── prefix.go # 前缀匹配
│ ├── regex.go # 正则匹配
│ ├── radix.go # 基数树匹配
│ ├── conflict.go # 冲突检测
│ ├── location.go # Location 定义
│ ├── named.go # 命名捕获组
│ └── prefix_priority.go # 前缀优先级排序
├── middleware/ # 中间件链
│ ├── middleware.go # 中间件接口
│ ├── compression/ # Gzip/Brotli 压缩
│ │ ├── compression.go # 压缩实现
│ │ └── gzip_static.go # 预压缩文件
│ ├── security/ # 安全中间件
│ │ ├── access.go # IP/CIDR 访问控制
│ │ ├── ratelimit.go # 令牌桶限流
│ │ ├── sliding_window.go # 滑动窗口限流
│ │ ├── auth.go # Basic Authbcrypt/argon2id
│ │ ├── auth_request.go # 子请求认证
│ │ ├── geoip.go # GeoIP 过滤
│ │ └── headers.go # 安全头部
│ ├── rewrite/ # URL 重写
│ ├── accesslog/ # 访问日志nginx 兼容格式)
│ ├── bodylimit/ # 请求体大小限制
│ ├── limitrate/ # 响应速率限制
│ └── errorintercept/ # 错误页面拦截
├── lua/ # Lua 脚本引擎
│ ├── engine.go # gopher-lua 引擎
│ ├── context.go # 请求上下文
│ ├── register.go # API 注册
│ ├── socket_manager.go # Socket 管理
│ ├── filter_writer.go # header/body_filter
│ └── api_*.go # nginx-lua 兼容 API20+ 文件)
├── http2/ # HTTP/2 服务器
│ ├── server.go # HTTP/2 实现
│ └── adapter.go # 适配器
├── http3/ # HTTP/3 服务器
│ ├── server.go # QUIC 服务器
│ └── adapter.go # 适配器
├── stream/ # TCP/UDP Stream 代理
│ ├── stream.go # 四层代理
│ └── ssl.go # Stream SSL
├── ssl/ # TLS 配置
│ ├── ssl.go # TLS 管理器
│ ├── ocsp.go # OCSP Stapling
│ ├── session_tickets.go # Session Tickets 轮换
│ └── client_verify.go # 客户端证书验证
├── cache/ # 缓存系统
│ ├── backend.go # 缓存后端抽象
│ ├── file_cache.go # 文件缓存LRU
│ ├── disk_cache.go # 磁盘缓存
│ ├── tiered_cache.go # L1/L2 分层缓存
│ └── purge.go # 缓存清除
├── resolver/ # DNS 解析器
│ ├── resolver.go # DNS 解析
│ ├── cache.go # DNS 缓存
│ └── stats.go # 解析统计
├── variable/ # 变量系统
│ ├── variable.go # 变量接口
│ ├── builtin.go # 内置变量($remote_addr 等)
│ ├── pool.go # 变量池
│ └── ssl.go # SSL 变量
├── converter/ # 配置转换器
│ └── nginx/ # nginx 配置导入
│ ├── parser.go # nginx 语法解析
│ └── converter.go # YAML 转换
├── logging/ # 日志系统
│ └── logging.go # zerolog 封装
├── netutil/ # 网络工具
│ ├── ip.go # IP 解析
│ ├── host.go # 主机名处理
│ └── url.go # URL 处理
├── mimeutil/ # MIME 类型
│ └── detect.go # MIME 检测
├── sslutil/ # SSL 工具
│ └── certpool.go # 证书池
├── utils/ # 通用工具
│ ├── httperror.go # HTTP 错误处理
│ └── internal.go # 内部工具
├── version/ # 版本信息
│ └── version.go # 版本定义
└── benchmark/ # 基准测试
└── tools/ # 测试辅助工具
├── app/ # 应用入口、信号处理、生命周期
├── config/ # 配置加载、验证、默认值
├── server/ # HTTP 服务器核心
├── handler/ # 请求处理器
├── proxy/ # 反向代理
├── loadbalance/ # 负载均衡算法
├── matcher/ # Location 匹配器
├── middleware/ # 中间件链
├── lua/ # Lua 脚本引擎
├── http2/ # HTTP/2 服务器
├── http3/ # HTTP/3 服务器
├── stream/ # TCP/UDP Stream 代理
├── ssl/ # TLS 配置
├── cache/ # 缓存系统
├── resolver/ # DNS 解析器
├── variable/ # 变量系统
├── logging/ # 日志系统
└── ... # 其他工具模块
```
### 核心设计
@ -696,103 +485,11 @@ services:
restart: unless-stopped
```
### systemd
创建 `/etc/systemd/system/lolly.service`
```ini
[Unit]
Description=Lolly HTTP Server
After=network.target
[Service]
Type=simple
User=lolly
Group=lolly
ExecStart=/usr/local/bin/lolly -c /etc/lolly/lolly.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
```
```bash
# 安装服务
sudo systemctl daemon-reload
sudo systemctl enable lolly
sudo systemctl start lolly
# 管理服务
sudo systemctl reload lolly # 重载配置
sudo systemctl restart lolly # 重启服务
sudo systemctl status lolly # 查看状态
```
## 监控
### 状态端点
访问 `/status`(需配置 `monitoring.status.allow` 白名单):
```json
{
"version": "0.2.2",
"uptime": "2h30m15s",
"connections": 150,
"requests": 125000,
"bytes_sent": 5368709120,
"bytes_received": 1073741824,
"pool": {
"workers": 256,
"IdleWorkers": 200,
"MaxWorkers": 10000,
"MinWorkers": 100,
"QueueLen": 0,
"QueueCap": 1000
},
"upstreams": [
{
"name": "backend1",
"targets": [
{ "url": "http://10.0.0.1:8080", "healthy": true, "latency_ms": 5 },
{ "url": "http://10.0.0.2:8080", "healthy": true, "latency_ms": 8 }
],
"healthy_count": 2,
"unhealthy_count": 0,
"latency_p50_ms": 5.2,
"latency_p95_ms": 12.5,
"latency_p99_ms": 25.0
}
],
"rate_limits": [
{
"zone_name": "api_limit",
"requests": 50000,
"limit": 100,
"rejected": 150
}
],
"ssl": {
"handshakes": 2500,
"session_reused": 800,
"reuse_rate_percent": 32.0
},
"cache": {
"file_cache": {
"entries": 5000,
"max_entries": 50000,
"size": 134217728,
"max_size": 268435456
},
"proxy_cache": {
"entries": 2000,
"pending": 5
}
}
}
```
访问 `/status`(需配置 `monitoring.status.allow` 白名单),返回服务器状态、连接池、上游健康、缓存命中等信息。
### pprof 端点
@ -875,54 +572,6 @@ performance:
| 中流量10K-100K RPS | 5000 | 256MB | 300 |
| 高流量(>100K RPS | 10000 | 512MB | 500 |
## 与 NGINX 对比
| 特性 | Lolly | NGINX |
| -------------- | --------------- | ------------ |
| HTTP/3 | 支持quic-go | 1.25+ 支持 |
| HTTP/2 | 支持(需 TLS | 支持 |
| 配置格式 | YAML | 自定义 DSL |
| 热升级 | 支持 | 支持 |
| 扩展方式 | Go 代码/Lua | C 模块/Lua |
| 部署方式 | 单二进制 | 需安装 |
| TCP/UDP Stream | 支持 | 支持 |
| 代理缓存 | 支持(带锁) | 支持 |
| GeoIP | MaxMind GeoIP2 | GeoIP 模块 |
| 一致性哈希 | 支持(内置) | 需第三方模块 |
**Lolly 优势**
- YAML 配置更易读、易于解析和生成
- 单二进制部署,无依赖
- Go 原生扩展,无需 C 编译环境
- 现代 Go 库生态系统
**NGINX 优势**
- 经过大规模生产验证
- 丰富的第三方模块生态
- 更完整的功能集(邮件代理等)
### 从 NGINX 迁移
常见配置转换示例:
| NGINX | Lolly |
| ------------------------------------------ | ---------------------------------------------- |
| `listen 80;` | `listen: ":80"` |
| `root /var/www/html;` | `root: "/var/www/html"` |
| `proxy_pass http://backend;` | `url: "http://backend"` |
| `proxy_set_header X-Real-IP $remote_addr;` | `set_request: { X-Real-IP: "$remote_addr" }` |
| `limit_req zone=one burst=10;` | `rate_limit: { request_rate: 100, burst: 10 }` |
| `ssl_certificate /path/cert.pem;` | `cert: "/path/cert.pem"` |
迁移注意事项:
1. 变量系统语法相同($remote_addr 等)
2. try_files 语法兼容
3. Lua API 与 OpenResty 高度兼容
4. 健康检查配置略有差异
## 故障排除
### 调试模式
@ -997,10 +646,10 @@ make lint
### 项目统计
- Go 源文件:174 个
- 测试文件:158
- 总代码行数:~136,000 行
- 测试覆盖率:>80%
- Go 源文件:234 个
- 测试文件:242
- 总代码行数:~189,000 行
- 测试覆盖率:81.3%
- 中文代码注释
- 所有核心模块均有完整单元测试和性能基准测试