Lolly

高性能 HTTP 服务器与反向代理,使用 Go 语言编写。

基于 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 信号触发,等待请求完成
  • 状态监控 - 内置状态端点,统计连接数、请求数、流量

安装

构建

# 克隆仓库
git clone https://github.com/xfy/lolly.git
cd lolly

# 本地构建
make build

# 生产构建(优化体积)
make build-prod

# 跨平台构建
make build-all

构建产物位于 bin/ 目录。

运行

# 使用默认配置
./bin/lolly

# 指定配置文件
./bin/lolly -c /path/to/lolly.yaml

# 生成默认配置
./bin/lolly --generate-config -o lolly.yaml

# 显示版本
./bin/lolly -v

配置

配置文件使用 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 热升级

测试

# 运行测试
make test

# 测试覆盖率
make test-cover

# 基准测试
make bench

# 代码检查
make check

性能

基于 fasthttp相比标准 net/http 有显著性能提升:

  • 避免不必要的内存分配
  • 优化的事件循环
  • 高效的连接池管理
  • 零拷贝传输

建议生产环境配置:

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
部署 单二进制 需安装
内存占用 较低 较低

依赖

许可证

MIT License

作者

xfy

Description
No description provided
Readme MIT 3.3 MiB
Languages
Go 98.5%
Python 0.8%
Makefile 0.5%
Shell 0.1%