279 Commits

Author SHA1 Message Date
xfy
d2e72b25be perf(lua): 添加 LuaContext 和协程池复用效果验证基准测试
添加 BenchmarkLuaContextPoolReuse 测试完整请求生命周期下的池复用率,
添加 BenchmarkLuaCoroutinePoolThroughput 测试高频率协程创建销毁的吞吐量。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 11:44:31 +08:00
xfy
49f1e26760 refactor(lua): 对象池类型安全优化
- 使用 any 替代 interface{} (Go 1.18+)
- 添加类型断言检查防止 Pool 误用

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 11:13:53 +08:00
xfy
eccdcde901 perf(proxy): 缓存键哈希计算零分配优化
- 新增 buildCacheKeyHashValue 直接计算哈希值
- 消除缓存键字符串构建的内存分配
- 内部调用改用新函数降低 GC 压力
- 添加基准测试对比两种方法性能差异

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 11:09:27 +08:00
xfy
9cbc380de5 perf(http3,compression): 对象池化和流式压缩优化
http3:
- Adapter 添加 ctxPool 复用 RequestCtx
- resetContext 方法重置状态避免污染

compression:
- 大响应(>64KB)使用 SetBodyStreamWriter 流式压缩
- 消除 compressed buffer 分配,降低内存峰值
- 新增 streamGzip/streamBrotli 流式方法
- 添加流式压缩测试验证功能正确性

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 11:09:26 +08:00
xfy
6dd651af5f perf(lua): LuaContext 对象池化优化
- 添加 luaContextPool 复用 LuaContext 对象
- 新增 AcquireContext 函数从池中获取
- Release 方法重置所有可变状态防止污染
- 添加状态隔离测试和多次复用测试
- 添加池化基准测试

降低 GC 压力,减少高频请求下的对象分配

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 11:09:26 +08:00
xfy
cd807e43aa docs(nginx): 添加 nginx 源码架构分析文档
- Upstream 模块源码实现分析(负载均衡算法、故障转移)
- Stream 模块架构分析(TCP/UDP 代理处理流程)
- Mail 模块架构概述(IMAP/POP3/SMTP 协议支持)
- 事件模块源码架构(定时器、epoll、QUIC)
- 变量系统源码实现(索引变量、前缀变量机制)

基于 nginx 1.31.0 源码分析

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 11:09:26 +08:00
xfy
89df85a5f4 docs(prompts): 简化任务列表,移除已完成项目
移除已完成的文档分析和优化任务,更新路径引用以匹配新的目录结构
(docs/nginx/ 和 lib/fasthttp/)。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 10:48:23 +08:00
xfy
79668f44af chore(gitignore): 更新忽略规则,统一 lib 目录
移除单独的 fasthttp/ 和 nginx/ 忽略项,改用统一的 lib/ 目录忽略,
匹配项目依赖库的新目录结构。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 10:48:23 +08:00
xfy
972eab4267 refactor(docs): 重构文档目录结构,nginx 文档移至子目录
将 docs/ 根目录下的 nginx 相关文档统一移动到 docs/nginx/ 子目录,
提高文档组织性和可维护性。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 10:48:14 +08:00
xfy
0a332e8cef docs(prompts): 添加 fasthttp 源码分析任务
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 09:54:24 +08:00
xfy
470c82d940 style(proxy,server): 代码风格优化
- headers.go: 添加协议常量 protoHTTP/protoHTTPS
- redirect_rewrite.go: 添加模式常量,修正缩进
- proxy_ssl_test.go: 表格测试字段对齐
- server.go: 添加 ServerModeAuto 分支防御性处理

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 09:54:09 +08:00
xfy
d874f97765 fix(handler): 修复 sendfile 高并发下的连接断开处理
- EPIPE/ECONNRESET 不再 fallback,直接返回错误避免响应混乱
- 正确处理 EAGAIN/EWOULDBLOCK socket 缓冲区满,等待重试
- EINTR 信号中断正确重试
- 改用 SetBodyStream 确保 HTTP 头先发送再 sendfile
- 添加重试限制(100次)防止无限循环

测试结果:0 错误/100000 并发请求

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 09:54:08 +08:00
xfy
0c20c62b5c refactor(config): 优化结构体内存布局减少 padding
ServerConfig、ProxyConfig、ProxySSLConfig 字段按类型大小排序:
指针→切片→字符串→结构体→int64→int→bool
减少内存对齐浪费,提升访问效率。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-16 09:53:58 +08:00
xfy
a644e551af feat(proxy): 添加上游 SSL 配置和缓存有效期分段配置
- ProxySSLConfig: 支持自定义 CA、客户端证书(mTLS)、SNI、TLS 版本控制
- ProxyCacheValidConfig: 按 HTTP 状态码分段配置缓存有效期
- proxy_ssl.go: 实现 CreateTLSConfig 和 TLS 版本解析
- proxy.go: 集成 SSL 配置到 HostClient,实现 getCacheDuration 分段缓存
- 测试文件适配新配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 18:27:50 +08:00
xfy
bf14282e40 feat(server): 添加高并发优化配置支持
- ServerConfig 新增 Concurrency/ReadBufferSize/WriteBufferSize/ReduceMemoryUsage 配置
- defaults.go 设置默认值:256K 并发连接、16KB 缓冲区
- server.go 在 singleMode 和 vhostMode 中应用配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 18:26:49 +08:00
xfy
fa55bfd497 feat(cache): 添加缓存 TTL 新鲜度验证优化
在 FileEntry 中新增 CachedAt 字段记录缓存时间,实现 TTL 窗口内的缓存新鲜度验证:
- TTL 内跳过 ModTime 验证,减少 os.Stat 调用
- TTL 过期后验证 ModTime,文件未修改时刷新 CachedAt
- 默认 TTL 设置为 5 秒

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 17:53:51 +08:00
xfy
b0380f8798 feat(server): 改用前缀匹配注册代理路由
使用 fasthttp/router 通配符路由替代精确匹配:
- path: / 匹配所有子路径如 /sorry/index
- path: /api/ 匹配 /api/* 所有子路径
- 路由格式: {path}/{path:*}

此改动确保代理路径下所有子请求都能正确路由到代理处理器,
支持 redirect_rewrite 功能正确处理子路径的重定向改写。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 17:01:30 +08:00
xfy
abbc4a50dd feat(proxy): 实现 Location/Refresh 头改写功能
- 新增 RedirectRewriter 改写器,支持三种模式:
  - default: 动态匹配 targetURL 前缀并替换为客户端原始 host
  - off: 禁用改写
  - custom: 使用预编译规则列表匹配替换
- 实现 RewriteResponse 方法改写 Location(3xx 状态码)和 Refresh 头
- 实现 RewriteRefreshOnly 方法用于缓存响应路径(仅 Refresh)
- 支持正则匹配(~ 前缀)和大小写不敏感(~* 前缀)
- 支持变量展开($host, $scheme, $server_port 等)
- 添加 parseRefreshHeader 解析 Refresh 头格式(N; url=URL)
- 在 Proxy.ServeHTTP 中集成改写器调用:
  - 保存 originalClientHost 用于 default 模式
  - 缓存响应路径调用 RewriteRefreshOnly
  - 正常响应路径调用 RewriteResponse
- 添加完整单元测试覆盖各模式和边界情况

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 17:01:30 +08:00
xfy
a026277385 feat(config): 添加 redirect_rewrite 配置定义和验证
- 新增 RedirectRewriteConfig 配置结构体,支持三种模式:
  - default: 自动从 target URL 生成改写规则(运行时)
  - off: 禁用 Location/Refresh 头改写
  - custom: 使用预定义规则列表(预编译)
- 新增 RedirectRewriteRule 规则结构体,支持正则(~ 前缀)和前缀匹配
- 添加 validateRedirectRewrite 验证函数:
  - Mode 有效性检查
  - custom 模式必须有规则
  - 正则表达式预编译检查
- 更新 GenerateConfigYAML 添加配置示例文档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 17:01:07 +08:00
xfy
aa73df964e fix(proxy): 修正代理请求 URI 和 Host 设置,添加调试日志
- 修复 ParseTargetURL 参数确保 HostClient.Addr 包含端口
- 设置请求 URI 为完整目标 URL(HostClient 要求格式一致)
- 设置 Host header 为目标主机(连接需要 host:port 格式)
- 添加 extractHostFromURL 辅助函数
- 添加 DEBUG 日志用于排查代理请求问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 14:21:23 +08:00
xfy
5b92e30b59 fix(middleware/bodylimit): 添加 BodyStream nil 检查防止空指针
在设置 body stream 限制前检查 stream 是否为 nil,
避免在无请求体的请求上调用 SetBodyStream 导致异常。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 14:20:58 +08:00
xfy
d5b4509014 refactor(config,server): 移除 Config.Server 字段,完善 servers 多服务器配置
- 移除 Config.Server 单服务器字段,统一使用 Servers 列表
- 为 ServerConfig 添加 Default 标记支持虚拟主机默认主机
- 重命名 GetDefaultServer 为 GetDefaultServerFromList
- 更新验证逻辑确保 servers 列表必填
- 更新默认配置生成和测试适配

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 13:32:36 +08:00
xfy
37d8f9eebc refactor(variable): 移除废弃的 PoolGet/PoolPut 和别名函数
移除 deprecated PoolGet、PoolPut 函数及 NewVariableContext、
ReleaseVariableContext 别名,统一使用 NewContext 和 ReleaseContext。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 12:48:49 +08:00
xfy
f04f804834 refactor(server): 移除废弃的 Stop 方法,更新测试使用 StopWithTimeout
移除 deprecated Stop() 方法,测试代码改用 StopWithTimeout。
testutil.go 更新为支持 servers 配置格式。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 12:48:49 +08:00
xfy
2bc13dd03b refactor(app): 改用 Servers[0] 替代旧版 Server 配置引用
将 cfg.Server 改为 cfg.Servers[0],适配多服务器配置格式。
HTTP/2、HTTP/3 等子模块配置同步更新。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 12:48:48 +08:00
xfy
39371c7f06 refactor(config): 移除旧版 server 配置迁移逻辑
移除 migrateLegacyConfig 函数及其调用,不再支持旧版单 server
配置格式。配置文件必须使用 servers 数组格式。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 12:48:36 +08:00
xfy
d99011aab6 test(config,app,server): 更新测试适配 servers 配置格式
- 所有测试用例使用 Servers[0] 替代 Server
- 断言检查 servers: 替代 server:
- 生成配置测试验证新格式输出

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 10:34:04 +08:00
xfy
168d34d58d refactor(config,app): 默认配置迁移到 servers 格式
- DefaultConfig() 使用 Servers[0] 替代 Server
- GenerateConfigYAML() 生成 servers 列表格式
- App.Run() 支持多服务器监听地址日志输出

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 10:34:04 +08:00
xfy
1f170b1951 refactor(server): 实现多服务器模式启动和关闭逻辑
- 新增 fastServers 列表支持多监听器
- 实现 startMultiServerMode() 并行启动多个服务器
- 添加 shutdownServers() 并行关闭多个 fasthttp.Server
- 重构 StopWithTimeout/GracefulStop 支持多服务器关闭
- startSingleMode 使用 Servers[0] 配置(迁移后)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 10:33:52 +08:00
xfy
6007e96f69 refactor(config): 添加 ServerMode 类型和多服务器模式支持
- 新增 ServerMode 枚举类型 (single/vhost/multi_server/auto)
- 实现 migrateLegacyConfig() 自动迁移旧版 server 配置到 servers[0]
- 添加 validateMode() 和 validateListenConflicts() 验证函数
- 配置加载时自动迁移,保持向后兼容

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 10:33:40 +08:00
xfy
11956a0f83 refactor(resolver,variable): 移除未使用的接口和测试代码
- resolver: 移除 StatsCollector 接口和 mockResolver 测试代码
- variable: 移除 Store 接口定义

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 15:56:29 +08:00
xfy
6866c763f1 refactor(security,proxy): 移除重复代码使用公共函数
- access: 移除 getRemoteAddrIP 改用 netutil.GetRemoteAddrIP
- proxy: 简化 createBalancer 调用 createBalancerByName

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 15:56:20 +08:00
xfy
cdc767160b refactor(security): 调整分段锁桶字段顺序优化内存布局
将 counters 字段置于 mu 锁之前,符合 Go 结构体字段排序最佳实践,
数据字段优先于锁字段,可能优化内存访问效率。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 14:53:21 +08:00
xfy
686b8c3239 refactor(lua): 调整配置字段顺序将协程池参数集中
将 CoroutinePoolWarmup 字段移至 CoroutineStackSize 后,
使协程相关配置字段集中在一起,便于理解和维护。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 14:53:12 +08:00
xfy
cf0ea6cc1f perf(lua): 完成协程栈优化配置集成
将 Lua 协程栈优化选项集成到配置系统中:
- CoroutineStackSize: 默认64,减少内存分配
- MinimizeStackMemory: 启用栈内存自动收缩
- CoroutinePoolWarmup: 默认预热4个协程

影响文件:
- internal/config/config.go: 添加配置项到 LuaGlobalSettings
- internal/lua/middleware_config.go: 中间件配置支持
- internal/server/init.go: 服务器初始化应用配置

优化效果(已在 engine.go 和 config.go 中实现):
- BenchmarkCoroutineCreation 内存减少18.7% (112KB->91KB)
- 延迟减少约27.6% (29us->21us)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 14:33:30 +08:00
xfy
fd4e164ae6 refactor(security): 滑动窗口限流器使用分段锁优化并发性能
将单一 counters map + 全局 mutex 改为 16 buckets 分段锁结构:

- 新增 limiterBucket 结构体,每个桶独立持有 RW 锁和计数器 map
- 使用 FNV-1a 哈希算法将键均匀分布到 16 个桶中
- 各方法修改为按 bucket 分发操作:
  - Allow() / allowApproximate() / allowPrecise()
  - Reset() / ResetAll() / Cleanup()
  - GetStats() / GetCount()

收益:
- 并发场景下锁竞争降低约 94% (16 个桶并行)
- 基准测试显示并行 Allow 操作约 89ns/op

测试验证:
- go test -race 通过并发安全测试
- 基准测试显示吞吐提升

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 14:26:01 +08:00
xfy
a7f01581cb perf(variable): 全局变量改为惰性加载降低每请求开销
之前 NewContext 每次复制所有全局变量到 vc.store,
现在改为 Get() 时按需查找 GetGlobalVariable(),
消除了无关请求的内存复制开销。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 14:25:13 +08:00
xfy
1b73df77b6 refactor(variable): 将 PoolStats 的 Mutex 改为 atomic.Int64 计数器
使用 sync/atomic 替代 sync.RWMutex,消除统计操作中的锁开销,
提升并发性能。保持 PoolStats 公开 API 不变(返回 plain int64)。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 14:24:52 +08:00
xfy
0e3ce8cf52 perf(http3): 移除 ctxPool sync.Pool 提升性能
基准测试显示 sync.Pool 反而降低性能:
- 有池:574 ns/op ~ 704 ns/op
- 无池:263 ns/op ~ 264 ns/op

移除池化逻辑,直接创建 RequestCtx 对象。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 14:17:43 +08:00
xfy
9f04b92a75 perf(cache): 优化 FileCache.Get() 锁粒度
移除 defer c.mu.Unlock(),在每个 early return 路径添加显式解锁,
在操作完成后立即释放锁,减少锁持有时间,提高并发性能。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 14:12:52 +08:00
xfy
4bf7318816 test(middleware/bodylimit,rewrite): 添加性能基准测试
为 middleware 子模块添加 benchmark 测试:
- bodylimit: 请求体大小限制检查
- rewrite: URL 重写规则匹配

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 10:49:38 +08:00
xfy
1b40a72632 test(server): 添加性能基准测试
为 server 模块添加 benchmark 测试:
- middleware: Panic 恢复、超时控制、请求体限制
- pool: Goroutine 池任务提交、并发处理

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 10:49:38 +08:00
xfy
d1da187acc test(http3,logging,netutil,resolver,stream): 添加性能基准测试
为核心模块添加 benchmark 测试:
- http3: Handler 包装、请求/响应转换、Body 读取
- logging: JSON/模板访问日志、变量展开
- netutil: TCPKeepAlive 配置解析
- resolver: DNS 解析性能
- stream: 健康过滤、UDP 会话、负载均衡

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 10:49:38 +08:00
xfy
322573b9aa test(http2,http3,proxy): 改进测试覆盖边界情况
- http2/adapter_test.go: 替换 pool reuse 测试,新增 header 转换边界测试
  - 空头测试、特殊字符、多值头、长头名称
- http3/server_test.go: 替换 stats struct 测试,新增 Alt-Svc 头边界测试
  - 端口边界值、禁用服务器、nil 配置
- http3/mock_test.go: 添加 QUIC listener mock 用于测试
- proxy/proxy_test.go: 添加 UpstreamTiming 边界测试
  - 零值测试、部分标记测试

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 17:38:59 +08:00
xfy
9144dcbb06 refactor(server): 提取初始化逻辑到独立函数
- 将 Start() 中的 goroutine pool 初始化提取为 initGoroutinePool()
- 将 file cache 初始化提取为 initFileCache()
- 将 Lua engine 初始化提取为 initLuaEngine()
- 将 error page manager 初始化提取为 initErrorPageManager()
- 添加 init.go 存放提取的初始化函数
- 添加 init_test.go 测试初始化函数
- 添加 testutil.go 提供测试 mock 和工具
- 添加 lua_integration_test.go Lua 中间件集成测试
- 添加 start_integration_test.go Start() 集成测试
- 添加 server_test.go nil tlsManager 测试
- 添加 lua/mock_engine.go Lua 引擎 mock 实现
- 添加 lua/api_balancer_test.go Lua balancer API 测试

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 17:38:49 +08:00
xfy
73ef7f4916 fix(lint): 修复剩余 lint 错误
- 统一八进制权限格式为 Go 1.13+ 风格 (0o644/0o755)
- 调整 Target 结构体字段顺序优化内存对齐
- 合并相邻的全局变量声明
- 删除多余空行
- 更新 Makefile 使用 gofumpt 替代 goimports

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 16:50:14 +08:00
xfy
0c8a15cfee fix(lint): 调整 Target 结构体字段顺序优化内存对齐 2026-04-13 16:41:20 +08:00
xfy
6b5494fde9 docs(lint): 标记 tenv linter 已弃用 2026-04-13 16:40:50 +08:00
xfy
5b41c3ab44 refactor(server): 使用 NewTargetFromConfig 简化目标创建 2026-04-13 16:40:50 +08:00
xfy
b722cbf884 style: 统一八进制权限格式和代码格式 2026-04-13 16:40:50 +08:00