@@ -6,236 +6,123 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
66
77# Candy 项目开发指南
88
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 和多种压缩格式)
9+ Candy 是一个用 Rust 编写的现代、轻量级 Web 服务器。提供静态文件服务、反向代理、负载均衡、Lua 脚本支持等功能。
3910
40- ## 常用命令
41-
42- ### 构建和运行
43-
44- ``` bash
45- # 调试构建
46- make build
47- make run
48-
49- # 发布构建
50- make release
11+ ## 规范
5112
52- # 开发模式(自动重载)
53- make dev # 使用 cargo watch 自动重载
13+ - candy 的 lua 全局变量为 cd(candy 的缩写)
14+ - 每次新增/修改某个功能时都必须要保证其对应的测试通过
15+ - 每个功能都必须有单元测试/集成测试
16+ - 多个任务使用 TODO list 来规划
5417
55- # 运行服务器
56- candy # 使用默认配置文件(config.toml)
57- candy -c /path/to/config.toml # 使用指定配置文件
58- candy --help # 查看帮助信息
59- ```
60-
61- ### 代码质量和测试
18+ ## 常用命令
6219
6320``` 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
21+ # 构建
22+ make build # 调试构建
23+ make release # 发布构建
7424
75- # 运行测试
76- make test # 运行所有测试(单线程)
77- cargo test # 直接使用 cargo
78- cargo test -- --test-threads=1 # 单线程测试(避免资源竞争)
25+ # 运行
26+ make run # 运行调试版本
27+ make run ARGS=" --config path/to/config.toml" # 带参数运行
7928
80- # 检查编译错误
81- make check
82- cargo check
29+ # 代码质量
30+ make check # 检查编译错误
31+ make format # 格式化代码
32+ make lint # 运行 Clippy 检查
33+ make fix # 自动修复 lint 问题并格式化
8334
84- # 运行单个测试
85- cargo test < test_name> -- --test-threads=1
35+ # 测试
36+ make test # 运行所有测试
37+ cargo test
38+ cargo test < test_name> # 运行单个测试
8639```
8740
88- ## 项目架构
89-
90- ### 核心模块
41+ ## 架构概览
9142
9243```
93- /Users/xfy/Developer/candy/src/
94- ├── main.rs # 入口点,服务器生命周期管理
44+ src/
45+ ├── main.rs # 入口点:配置加载、服务器启动、配置热重载
46+ ├── config.rs # 配置结构体定义和验证
9547├── cli.rs # 命令行参数解析
96- ├── config.rs # 配置加载、验证和结构体定义
97- ├── consts.rs # 常量定义
98- ├── error.rs # 自定义错误类型
99- ├── http/ # HTTP 相关模块
100- │ ├── mod.rs # 服务器创建和路由注册
48+ ├── http/
49+ │ ├── mod.rs # 服务器创建、路由注册、全局状态(HOSTS/UPSTREAMS)
10150│ ├── 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 # 工具模块入口
51+ │ ├── reverse_proxy.rs # 反向代理 + 负载均衡 + 健康检查
52+ │ ├── forward_proxy.rs # 正向代理
53+ │ └── lua/ # Lua 脚本处理(可选特性)
54+ ├── lua_engine/ # Lua 引擎初始化和共享字典(可选特性)
55+ ├── middlewares/ # Axum 中间件
56+ └── utils/
11057 ├── config_watcher.rs # 配置文件监听(自动重载)
111- ├── logging.rs # 日志初始化
112- └── service.rs # 服务工具
58+ └── logging.rs # 日志初始化
11359```
11460
115- ### 关键架构特点
61+ ### 关键数据结构
62+
63+ - ** HOSTS** : ` DashMap<u16, DashMap<Option<String>, SettingHost>> ` - 按端口和域名存储主机配置
64+ - ** UPSTREAMS** : ` DashMap<String, Upstream> ` - 上游服务器组配置
65+ - ** 路由优先级** : redirect_to > lua_script > proxy_pass/upstream > forward_proxy > root
66+
67+ ### 请求处理流程
68+
69+ 1 . 配置文件解析 → ` Settings::new() ` 验证并构建配置
70+ 2 . 服务器启动 → ` start_initial_servers() ` 为每个 host 创建 Axum 实例
71+ 3 . 路由注册 → ` make_server() ` 根据 route 类型注册不同 handler
72+ 4 . 配置变更 → ` config_watcher ` 监听文件变化,优雅重启服务器
11673
117- 1 . ** 异步架构** : 基于 Tokio 异步运行时和 Axum 框架
118- 2 . ** 并发安全** : 使用 DashMap 实现高性能并发数据结构
119- 3 . ** 模块化设计** : 清晰的模块划分,各功能独立实现
120- 4 . ** 配置驱动** : 完整的配置验证和自动重载机制
121- 5 . ** 可扩展性** : 支持可选特性(如 Lua 脚本)通过 Cargo features 实现
74+ ## 负载均衡算法
12275
123- ## 配置文件
76+ | 算法 | 配置值 | 说明 |
77+ | -------- | ---------------------- | -------------------------- |
78+ | 加权轮询 | ` weighted_round_robin ` | 默认,按权重分配 |
79+ | 轮询 | ` round_robin ` | 简单轮询 |
80+ | IP 哈希 | ` iphash ` | 会话保持 |
81+ | 最少连接 | ` least_conn ` | 动态分配到连接最少的服务器 |
12482
125- ### 主配置文件结构
83+ ## 可选特性
12684
127- 默认配置文件路径:` config.toml `
85+ ``` bash
86+ # 编译时启用/禁用 Lua 支持
87+ cargo build --features lua # 启用 Lua(默认)
88+ cargo build --no-default-features # 禁用 Lua
89+ ```
90+
91+ ## 配置文件示例
12892
12993``` toml
13094log_level = " info"
13195log_folder = " ./logs"
13296
133- # 上游服务器组(用于负载均衡)
97+ # 负载均衡上游
13498[[upstream ]]
135- name = " test_backend"
99+ name = " backend"
100+ method = " weighted_round_robin"
136101server = [
137- { server = " 192.168.1.100:8080" },
138- { server = " 192.168.1.101:8080" , weight = 2 }
102+ { server = " 192.168.1.100:8080" , weight = 3 },
103+ { server = " 192.168.1.101:8080" , weight = 1 }
139104]
140- method = " weighted_round_robin" # 负载均衡方法:round_robin/weighted_round_robin/ip_hash/least_conn
141105
142- # 虚拟主机配置
106+ # 虚拟主机
143107[[host ]]
144108ip = " 0.0.0.0"
145109port = 8080
146- ssl = false
147110timeout = 30
148111
149- # 路由配置
150112[[host .route ]]
151113location = " /"
152114root = " ./html"
153- index = [" index.html" , " index.htm" ]
154115auto_index = true
155116
156117[[host .route ]]
157118location = " /api"
158- upstream = " test_backend "
119+ upstream = " backend "
159120proxy_timeout = 10
160- max_body_size = 1048576
161121```
162122
163- ### 负载均衡算法
164-
165- - ** RoundRobin** : 简单轮询(默认)
166- - ** WeightedRoundRobin** : 加权轮询,支持服务器权重配置
167- - ** IpHash** : IP 哈希算法,实现会话保持
168- - ** LeastConn** : 最少连接数算法,动态分配请求到连接数最少的服务器
169-
170- ## 开发流程
123+ ## 开发注意事项
171124
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- ```
125+ - ** 测试隔离** : 测试使用全局状态(HOSTS/UPSTREAMS),必须单线程运行
126+ - ** 配置验证** : SSL 需要证书文件存在,upstream 引用必须存在
127+ - ** 热重载** : 修改配置文件后服务器自动重启,无需手动干预
128+ - ** 调试日志** : 设置 ` log_level = "trace" ` 或环境变量 ` RUST_BACKTRACE=full `
0 commit comments