176 lines
8.7 KiB
Markdown
176 lines
8.7 KiB
Markdown
# Lolly
|
||
|
||
[](https://golang.org)
|
||
[](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
|