|
| 1 | +``` |
| 2 | +# CLAUDE.md |
| 3 | +
|
| 4 | +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. |
| 5 | +``` |
| 6 | + |
| 7 | +# Candy 项目开发指南 |
| 8 | + |
| 9 | +## 项目概述 |
| 10 | + |
| 11 | +Candy 是一个用 Rust 编写的现代、轻量级 Web 服务器(版本 0.2.5)。它提供了静态文件服务、反向代理、负载均衡、Lua 脚本支持等功能,是一个高性能且易于配置的服务器解决方案。 |
| 12 | + |
| 13 | +## 核心功能 |
| 14 | + |
| 15 | +- 静态文件服务,支持目录列表 |
| 16 | +- 反向代理,支持负载均衡(轮询、加权轮询、IP 哈希、最少连接) |
| 17 | +- Lua 脚本支持(可选功能) |
| 18 | +- SSL/TLS 加密(HTTPS),支持 HTTP/2 |
| 19 | +- 配置文件变更自动重载(带防抖机制) |
| 20 | +- 多虚拟主机支持 |
| 21 | +- 正向代理支持 |
| 22 | +- HTTP 重定向处理 |
| 23 | +- 自定义错误页面 |
| 24 | +- 健康检查功能(主动和被动) |
| 25 | +- 详细的调试日志和监控 |
| 26 | + |
| 27 | +## 技术栈 |
| 28 | + |
| 29 | +- **Web 框架**: Axum(异步、高性能) |
| 30 | +- **服务器**: Axum Server(HTTP/1.1 + HTTP/2) |
| 31 | +- **异步运行时**: Tokio |
| 32 | +- **日志**: Tracing(含文件日志和控制台输出) |
| 33 | +- **配置**: Serde + TOML(带验证和自动重载) |
| 34 | +- **压缩**: Axum 压缩中间件(gzip、deflate、brotli、zstd) |
| 35 | +- **Lua 支持**: Mlua(可选,Lua 5.4) |
| 36 | +- **配置监听**: Notify 库(带防抖机制) |
| 37 | +- **数据结构**: DashMap(并发安全哈希表) |
| 38 | +- **HTTP 客户端**: Reqwest(支持 HTTP/2 和多种压缩格式) |
| 39 | + |
| 40 | +## 常用命令 |
| 41 | + |
| 42 | +### 构建和运行 |
| 43 | + |
| 44 | +```bash |
| 45 | +# 调试构建 |
| 46 | +make build |
| 47 | +make run |
| 48 | + |
| 49 | +# 发布构建 |
| 50 | +make release |
| 51 | + |
| 52 | +# 开发模式(自动重载) |
| 53 | +make dev # 使用 cargo watch 自动重载 |
| 54 | + |
| 55 | +# 运行服务器 |
| 56 | +candy # 使用默认配置文件(config.toml) |
| 57 | +candy -c /path/to/config.toml # 使用指定配置文件 |
| 58 | +candy --help # 查看帮助信息 |
| 59 | +``` |
| 60 | + |
| 61 | +### 代码质量和测试 |
| 62 | + |
| 63 | +```bash |
| 64 | +# 格式化代码 |
| 65 | +make format # 使用 rustfmt 格式化 |
| 66 | +cargo fmt # 直接使用 cargo |
| 67 | + |
| 68 | +# 运行 Clippy 检查 |
| 69 | +make lint # 运行 Clippy 检查 |
| 70 | +cargo clippy # 直接使用 cargo |
| 71 | + |
| 72 | +# 自动修复 lint 问题并格式化 |
| 73 | +make fix |
| 74 | + |
| 75 | +# 运行测试 |
| 76 | +make test # 运行所有测试(单线程) |
| 77 | +cargo test # 直接使用 cargo |
| 78 | +cargo test -- --test-threads=1 # 单线程测试(避免资源竞争) |
| 79 | + |
| 80 | +# 检查编译错误 |
| 81 | +make check |
| 82 | +cargo check |
| 83 | + |
| 84 | +# 运行单个测试 |
| 85 | +cargo test <test_name> -- --test-threads=1 |
| 86 | +``` |
| 87 | + |
| 88 | +## 项目架构 |
| 89 | + |
| 90 | +### 核心模块 |
| 91 | + |
| 92 | +``` |
| 93 | +/Users/xfy/Developer/candy/src/ |
| 94 | +├── main.rs # 入口点,服务器生命周期管理 |
| 95 | +├── cli.rs # 命令行参数解析 |
| 96 | +├── config.rs # 配置加载、验证和结构体定义 |
| 97 | +├── consts.rs # 常量定义 |
| 98 | +├── error.rs # 自定义错误类型 |
| 99 | +├── http/ # HTTP 相关模块 |
| 100 | +│ ├── mod.rs # 服务器创建和路由注册 |
| 101 | +│ ├── serve.rs # 静态文件服务 |
| 102 | +│ ├── reverse_proxy.rs # 反向代理实现(含负载均衡) |
| 103 | +│ ├── forward_proxy.rs # 正向代理实现 |
| 104 | +│ ├── redirect.rs # 重定向处理 |
| 105 | +│ └── lua.rs # Lua 脚本集成(可选) |
| 106 | +├── lua_engine.rs # Lua 引擎初始化(可选特性) |
| 107 | +├── middlewares/ # Axum 中间件实现 |
| 108 | +└── utils/ # 工具模块 |
| 109 | + ├── mod.rs # 工具模块入口 |
| 110 | + ├── config_watcher.rs # 配置文件监听(自动重载) |
| 111 | + ├── logging.rs # 日志初始化 |
| 112 | + └── service.rs # 服务工具 |
| 113 | +``` |
| 114 | + |
| 115 | +### 关键架构特点 |
| 116 | + |
| 117 | +1. **异步架构**: 基于 Tokio 异步运行时和 Axum 框架 |
| 118 | +2. **并发安全**: 使用 DashMap 实现高性能并发数据结构 |
| 119 | +3. **模块化设计**: 清晰的模块划分,各功能独立实现 |
| 120 | +4. **配置驱动**: 完整的配置验证和自动重载机制 |
| 121 | +5. **可扩展性**: 支持可选特性(如 Lua 脚本)通过 Cargo features 实现 |
| 122 | + |
| 123 | +## 配置文件 |
| 124 | + |
| 125 | +### 主配置文件结构 |
| 126 | + |
| 127 | +默认配置文件路径:`config.toml` |
| 128 | + |
| 129 | +```toml |
| 130 | +log_level = "info" |
| 131 | +log_folder = "./logs" |
| 132 | + |
| 133 | +# 上游服务器组(用于负载均衡) |
| 134 | +[[upstream]] |
| 135 | +name = "test_backend" |
| 136 | +server = [ |
| 137 | + { server = "192.168.1.100:8080" }, |
| 138 | + { server = "192.168.1.101:8080", weight = 2 } |
| 139 | +] |
| 140 | +method = "weighted_round_robin" # 负载均衡方法:round_robin/weighted_round_robin/ip_hash/least_conn |
| 141 | + |
| 142 | +# 虚拟主机配置 |
| 143 | +[[host]] |
| 144 | +ip = "0.0.0.0" |
| 145 | +port = 8080 |
| 146 | +ssl = false |
| 147 | +timeout = 30 |
| 148 | + |
| 149 | +# 路由配置 |
| 150 | +[[host.route]] |
| 151 | +location = "/" |
| 152 | +root = "./html" |
| 153 | +index = ["index.html", "index.htm"] |
| 154 | +auto_index = true |
| 155 | + |
| 156 | +[[host.route]] |
| 157 | +location = "/api" |
| 158 | +upstream = "test_backend" |
| 159 | +proxy_timeout = 10 |
| 160 | +max_body_size = 1048576 |
| 161 | +``` |
| 162 | + |
| 163 | +### 负载均衡算法 |
| 164 | + |
| 165 | +- **RoundRobin**: 简单轮询(默认) |
| 166 | +- **WeightedRoundRobin**: 加权轮询,支持服务器权重配置 |
| 167 | +- **IpHash**: IP 哈希算法,实现会话保持 |
| 168 | +- **LeastConn**: 最少连接数算法,动态分配请求到连接数最少的服务器 |
| 169 | + |
| 170 | +## 开发流程 |
| 171 | + |
| 172 | +### 调试 |
| 173 | + |
| 174 | +- 使用 `RUST_BACKTRACE=full` 环境变量获取完整堆栈跟踪 |
| 175 | +- 使用 `log_level = "trace"` 在配置文件中启用详细日志 |
| 176 | +- 使用 `cargo run -- --help` 查看命令行选项 |
| 177 | + |
| 178 | +### 添加新功能 |
| 179 | + |
| 180 | +1. 确定功能所属模块或创建新模块 |
| 181 | +2. 实现功能逻辑 |
| 182 | +3. 更新配置结构(如有需要) |
| 183 | +4. 更新路由注册(src/http/mod.rs) |
| 184 | +5. 编写测试 |
| 185 | +6. 运行 `make lint` 和 `make test` |
| 186 | +7. 提交代码 |
| 187 | + |
| 188 | +### 修改配置 |
| 189 | + |
| 190 | +- 编辑 `config.toml` 文件 |
| 191 | +- 服务器会自动检测变化并重启 |
| 192 | +- 确保配置结构与 `src/config.rs` 中的定义匹配 |
| 193 | + |
| 194 | +## 监控与维护 |
| 195 | + |
| 196 | +### 日志 |
| 197 | + |
| 198 | +- 默认日志目录:`./logs/` |
| 199 | +- 日志文件格式:`candy-[日期].log` |
| 200 | +- 使用 `tail -f logs/candy-[日期].log` 实时查看日志 |
| 201 | + |
| 202 | +### 常见问题 |
| 203 | + |
| 204 | +1. **配置验证失败**:检查配置文件格式和值是否符合要求 |
| 205 | +2. **端口占用**:使用 `lsof -i :端口号` 查找占用进程 |
| 206 | +3. **SSL 证书问题**:确保证书和密钥文件路径正确,权限合适 |
| 207 | +4. **性能问题**:检查上游服务器响应时间,优化负载均衡配置 |
| 208 | + |
| 209 | +## 性能优化 |
| 210 | + |
| 211 | +### 已实现的优化 |
| 212 | + |
| 213 | +- 使用 MiMalloc 内存分配器替代默认分配器 |
| 214 | +- 启用 HTTP/2 支持 |
| 215 | +- 实现请求和响应压缩 |
| 216 | +- 优化连接池管理 |
| 217 | +- 使用并发安全数据结构 |
| 218 | + |
| 219 | +### 构建优化 |
| 220 | + |
| 221 | +发布构建配置(Cargo.toml): |
| 222 | +- `opt-level = 3`:最高优化级别 |
| 223 | +- `strip = true`:移除调试符号 |
| 224 | +- `lto = true`:启用链接时优化 |
| 225 | +- `codegen-units = 1`:允许更好的优化 |
| 226 | + |
| 227 | +## 测试覆盖 |
| 228 | + |
| 229 | +项目包含全面的单元测试,覆盖: |
| 230 | +- 配置验证 |
| 231 | +- 服务器启动和关闭 |
| 232 | +- 静态文件服务 |
| 233 | +- 反向代理和负载均衡 |
| 234 | +- 健康检查 |
| 235 | +- 配置文件监听和重载 |
| 236 | +- 路由匹配 |
| 237 | + |
| 238 | +运行所有测试: |
| 239 | +```bash |
| 240 | +make test |
| 241 | +``` |
0 commit comments