# Lolly [![Go Version](https://img.shields.io/badge/Go-1.26%2B-00ADD8?style=flat&logo=go)](https://golang.org) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) 高性能 HTTP 服务器与反向代理,使用 Go 语言编写。 基于 [fasthttp](https://github.com/valyala/fasthttp) 构建,提供比标准 net/http 更高的性能。支持 HTTP/3 (QUIC)、WebSocket、虚拟主机、多种负载均衡算法、故障转移、代理缓存、Lua 脚本扩展,以及完整的安全与性能优化特性。 > **代码统计**:154 个源文件 | 171 个测试文件 | ~121,000 行 Go 代码 ## 特性 ### 核心功能 - **静态文件服务** - 零拷贝传输(sendfile)、文件缓存、预压缩支持、try_files 配置、ETag 和 304 Not Modified - **反向代理** - 请求头/响应头修改、超时控制、故障转移(next_upstream)、Location/Refresh 头改写 - **HTTP/2** - 完整的 HTTP/2 服务器支持,包含适配器与流控 - **HTTP/3 (QUIC)** - 基于 quic-go,支持 0-RTT 连接 - **WebSocket** - 完整的 WebSocket 代理支持 - **虚拟主机** - 单进程支持多域名独立配置,server_name 支持通配符和正则匹配 - **Location 匹配** - nginx 风格的精确/前缀/正则匹配引擎 - **Unix Socket** - 支持 Unix socket 监听 - **配置引入** - include 指令支持配置拆分 - **TCP/UDP Stream** - 四层代理,支持 MySQL、Redis 等服务 - **Lua 脚本** - 基于 gopher-lua 的可编程扩展,支持 nginx-lua 兼容 API - **GeoIP 过滤** - 基于 MaxMind GeoIP2 的国家/地区访问控制 - **自定义错误页面** - 支持为特定状态码配置自定义错误页面 - **nginx 配置导入** - 支持将 nginx 配置文件转换为 lolly YAML 配置 - **变量系统** - nginx 风格变量(`$request_uri`、`$remote_addr`、`$host` 等),支持自定义变量 - **Gzip/Brotli 压缩** - 动态与预压缩(gzip_static/br_static)支持 - **URL 重写** - 正则替换、break/last/redirect/permanent 标记 - **目录索引** - 自动生成目录列表(HTML/JSON/XML) - **访问日志** - 结构化访问日志,支持自定义格式 - **DNS 解析缓存** - 带 TTL 与统计的缓存 DNS 解析器 ### 负载均衡 | 算法 | 说明 | | -------------------- | -------------------------------------------------------- | | Round Robin | 轮询,均匀分配 | | Weighted Round Robin | 加权轮询,按权重分配 | | Least Connections | 最少连接,选择活跃连接最少的目标 | | IP Hash | IP 哈希,同一客户端始终路由到同一目标 | | Consistent Hash | 一致性哈希,支持虚拟节点(默认 150),最小化节点变更影响 | | Random | Power of Two Choices,随机选择两个后比较,简单高效 | ### 安全 - **访问控制** - IP/CIDR 白名单与黑名单,支持 trusted_proxies 配置 - **速率限制** - 令牌桶与滑动窗口算法,支持精确/近似模式 - **连接限制** - 单 IP 并发连接数限制 - **认证** - Basic Auth,支持 bcrypt 与 argon2id;外部 auth_request 子请求 - **安全头部** - HSTS、X-Frame-Options、CSP、Referrer-Policy - **SSL/TLS** - OCSP Stapling、TLS 1.2/1.3、加密套件配置、Session Tickets 密钥轮换、客户端证书验证(mTLS) - **请求体限制** - 可配置全局和路径级别的请求体大小限制 ### 性能优化 - **Goroutine 池** - 限制并发 worker 数量,避免 goroutine 爆炸 - **文件缓存** - LRU 淘汰策略,内存上限控制 - **连接池** - 基于 fasthttp HostClient 的空闲连接复用,减少连接建立开销 - **零拷贝** - 大文件(≥8KB)在 Linux 上使用 sendfile 系统调用,其他平台自动回退到高效拷贝 - **代理缓存** - 支持缓存后端响应,cache_lock 防止缓存击穿与并发回源 - **PGO 优化** - 支持 Profile-Guided Optimization 构建 ### 运维 - **热升级** - USR2 信号触发,零停机升级,支持 Unix Socket 继承 - **配置热重载** - HUP 信号触发,动态更新配置 - **日志轮转** - USR1 信号触发,重新打开日志文件 - **优雅关闭** - QUIT 信号触发,等待请求完成,支持超时配置 - **状态监控** - 内置 `/status` 端点,统计连接数、请求数、流量、上游健康状态、缓存命中率 - **pprof 端点** - 内置性能分析端点,支持 CPU/heap/goroutine/block 分析 - **缓存清理 API** - POST `/purge` 端点,支持按路径清理代理缓存 ## 架构 ``` +------------------+ | Client | +--------+---------+ | +-------------------+-------------------+ | | | +----v----+ +-----v-----+ +----v----+ | HTTP/1 | | HTTP/2 | | HTTP/3 | | (TCP) | | (TLS) | | (QUIC) | +----+----+ +-----+-----+ +----+----+ | | | +-------------------+-------------------+ | +--------v---------+ | Middleware | | Chain | +--------+---------+ | +-------------------+-------------------+ | | | +----v----+ +-----v-----+ +----v----+ | Static | | Proxy | | Stream | | Handler | | Handler | | Handler | +----+----+ +-----+-----+ +----+----+ | | | File Cache Load Balancer L4 Proxy | | | +----+----+ +-----v-----+ +----v----+ | Disk | | Upstream | | Backend | | I/O | | Targets | | Servers | +---------+ +-----------+ +---------+ ``` ### 目录结构 ``` internal/ ├── app/ # 应用入口、信号处理、生命周期 ├── config/ # 配置加载、验证、默认值 ├── server/ # HTTP 服务器核心 ├── handler/ # 请求处理器 ├── proxy/ # 反向代理 ├── loadbalance/ # 负载均衡算法 ├── matcher/ # Location 匹配器 ├── middleware/ # 中间件链 │ ├── compression/ # Gzip/Brotli 压缩 │ ├── security/ # 访问控制、认证、限流、安全头部 │ ├── rewrite/ # URL 重写 │ ├── accesslog/ # 访问日志 │ ├── bodylimit/ # 请求体限制 │ └── errorintercept/ # 错误拦截 ├── lua/ # Lua 脚本引擎 ├── http2/ # HTTP/2 服务器 ├── http3/ # HTTP/3 服务器 ├── adapter/ # HTTP/2、HTTP/3 适配器 ├── stream/ # TCP/UDP Stream 代理 ├── ssl/ # TLS 配置 ├── cache/ # 缓存系统 ├── resolver/ # DNS 解析器 ├── variable/ # 变量系统 ├── logging/ # 日志系统 ├── converter/ # nginx 配置转换器 └── ... # 其他工具模块 ``` ## 信号处理 | 信号 | 行为 | | --------------- | ---------------------- | | SIGTERM, SIGINT | 快速停止 | | SIGQUIT | 优雅停止,等待请求完成 | | SIGHUP | 重载配置 | | SIGUSR1 | 重新打开日志文件 | | SIGUSR2 | 热升级 | ## 依赖 | 库 | 用途 | | ----------------------------------------------------------- | ---------------- | | [fasthttp](https://github.com/valyala/fasthttp) | HTTP 服务器核心 | | [fasthttp/router](https://github.com/fasthttp/router) | HTTP 路由器 | | [quic-go](https://github.com/quic-go/quic-go) | QUIC/HTTP/3 实现 | | [zerolog](https://github.com/rs/zerolog) | 零分配 JSON 日志 | | [gopher-lua](https://github.com/yuin/gopher-lua) | Lua 脚本引擎 | | [klauspost/compress](https://github.com/klauspost/compress) | Gzip/Brotli 压缩 | | [geoip2-golang](https://github.com/oschwald/geoip2-golang) | GeoIP 查询 | | [golang-lru/v2](https://github.com/hashicorp/golang-lru) | LRU 缓存 | | [yaml.v3](https://gopkg.in/yaml.v3) | YAML 配置解析 | ## 许可证 MIT License ## 作者 xfy