diff --git a/README.md b/README.md new file mode 100644 index 0000000..30d3c8c --- /dev/null +++ b/README.md @@ -0,0 +1,243 @@ +# Lolly + +高性能 HTTP 服务器与反向代理,使用 Go 语言编写。 + +基于 [fasthttp](https://github.com/valyala/fasthttp) 构建,提供比标准 net/http 更高的性能。支持 HTTP/3、WebSocket、虚拟主机、多种负载均衡算法,以及完整的安全与性能优化特性。 + +## 特性 + +### 核心功能 + +- **静态文件服务** - 零拷贝传输(sendfile)、文件缓存、预压缩支持 +- **反向代理** - 完整的代理功能,支持请求头/响应头修改、超时控制 +- **HTTP/3 (QUIC)** - 基于 quic-go,支持 0-RTT 连接 +- **WebSocket** - 完整的 WebSocket 代理支持 +- **虚拟主机** - 单进程支持多域名独立配置 +- **TCP/UDP Stream** - 四层代理,支持 MySQL、Redis 等服务 + +### 负载均衡 + +| 算法 | 说明 | +|------|------| +| Round Robin | 轮询,均匀分配 | +| Weighted Round Robin | 加权轮询,按权重分配 | +| Least Connections | 最少连接,选择活跃连接最少的目标 | +| IP Hash | IP 哈希,同一客户端始终路由到同一目标 | +| Consistent Hash | 一致性哈希,支持虚拟节点,最小化节点变更影响 | + +### 安全 + +- **访问控制** - IP/CIDR 白名单与黑名单 +- **速率限制** - 令牌桶与滑动窗口算法 +- **认证** - Basic Auth,支持 bcrypt 与 argon2id +- **安全头部** - HSTS、X-Frame-Options、CSP、Referrer-Policy +- **SSL/TLS** - OCSP Stapling、TLS 1.2/1.3、加密套件配置 + +### 性能优化 + +- **Goroutine 池** - 限制并发 worker 数量,避免 goroutine 爆炸 +- **文件缓存** - LRU 淘汰策略,内存上限控制 +- **连接池** - 空闲连接复用,减少连接建立开销 +- **零拷贝** - 大文件传输使用 sendfile 系统调用 + +### 运维 + +- **热升级** - USR2 信号触发,零停机升级 +- **配置热重载** - HUP 信号触发,动态更新配置 +- **日志轮转** - USR1 信号触发,重新打开日志文件 +- **优雅关闭** - QUIT 信号触发,等待请求完成 +- **状态监控** - 内置状态端点,统计连接数、请求数、流量 + +## 安装 + +### 构建 + +```bash +# 克隆仓库 +git clone https://github.com/xfy/lolly.git +cd lolly + +# 本地构建 +make build + +# 生产构建(优化体积) +make build-prod + +# 跨平台构建 +make build-all +``` + +构建产物位于 `bin/` 目录。 + +### 运行 + +```bash +# 使用默认配置 +./bin/lolly + +# 指定配置文件 +./bin/lolly -c /path/to/lolly.yaml + +# 生成默认配置 +./bin/lolly --generate-config -o lolly.yaml + +# 显示版本 +./bin/lolly -v +``` + +## 配置 + +配置文件使用 YAML 格式。以下是基本示例: + +```yaml +server: + listen: ":8080" + static: + root: "/var/www/html" + index: ["index.html", "index.htm"] + proxy: + - path: "/api" + targets: + - url: "http://backend1:8080" + weight: 2 + - url: "http://backend2:8080" + weight: 1 + load_balance: "weighted_round_robin" + health_check: + interval: 10s + path: "/health" + timeout: 5s + ssl: + cert: "/etc/ssl/certs/server.crt" + key: "/etc/ssl/private/server.key" + compression: + type: "gzip" + level: 6 + min_size: 1024 + security: + rate_limit: + request_rate: 100 + burst: 200 + +http3: + enabled: true + listen: ":443" + max_streams: 100 + +logging: + format: "json" + access: + path: "/var/log/lolly/access.log" + error: + path: "/var/log/lolly/error.log" + level: "info" + +performance: + goroutine_pool: + enabled: true + max_workers: 1000 + file_cache: + max_entries: 10000 + max_size: 100MB +``` + +完整配置说明请参考源码 `internal/config/config.go`。 + +## 架构 + +``` +internal/ + app/ # 应用入口、信号处理、生命周期 + config/ # 配置加载、验证、默认值 + server/ # HTTP 服务器、虚拟主机、Goroutine 池 + handler/ # 路由器、静态文件处理器 + proxy/ # 反向代理、WebSocket、健康检查 + loadbalance/ # 负载均衡算法 + middleware/ # 中间件链 + compression/ # Gzip/Brotli 压缩 + security/ # 访问控制、限流、认证、安全头部 + rewrite/ # URL 重写 + accesslog/ # 访问日志 + http3/ # HTTP/3 服务器 + stream/ # TCP/UDP Stream 代理 + ssl/ # TLS 配置、OCSP Stapling + cache/ # 文件缓存、代理缓存 + logging/ # 日志系统 +``` + +## 信号处理 + +| 信号 | 行为 | +|------|------| +| SIGTERM, SIGINT | 快速停止 | +| SIGQUIT | 优雅停止,等待请求完成 | +| SIGHUP | 重载配置 | +| SIGUSR1 | 重新打开日志文件 | +| SIGUSR2 | 热升级 | + +## 测试 + +```bash +# 运行测试 +make test + +# 测试覆盖率 +make test-cover + +# 基准测试 +make bench + +# 代码检查 +make check +``` + +## 性能 + +基于 fasthttp,相比标准 net/http 有显著性能提升: + +- 避免不必要的内存分配 +- 优化的事件循环 +- 高效的连接池管理 +- 零拷贝传输 + +建议生产环境配置: + +```yaml +performance: + goroutine_pool: + enabled: true + max_workers: 10000 + file_cache: + max_entries: 50000 + max_size: 256MB + transport: + max_idle_conns: 1000 + max_idle_conns_per_host: 100 + idle_conn_timeout: 90s +``` + +## 与 NGINX 对比 + +| 特性 | Lolly | NGINX | +|------|-------|-------| +| HTTP/3 | 支持 | 1.25+ 支持 | +| 配置格式 | YAML | 自定义格式 | +| 热升级 | 支持 | 支持 | +| 扩展方式 | Go 代码 | C 模块/Lua | +| 部署 | 单二进制 | 需安装 | +| 内存占用 | 较低 | 较低 | + +## 依赖 + +- [fasthttp](https://github.com/valyala/fasthttp) - 高性能 HTTP 服务器 +- [quic-go](https://github.com/quic-go/quic-go) - QUIC/HTTP/3 实现 +- [zerolog](https://github.com/rs/zerolog) - 高性能日志库 +- [klauspost/compress](https://github.com/klauspost/compress) - 压缩算法 + +## 许可证 + +MIT License + +## 作者 + +xfy \ No newline at end of file