Skip to content

Commit 5a643d9

Browse files
DefectingCatclaude
andcommitted
refactor(lua): migrate API namespace from ngx to cd
- Rename global Lua namespace from `ngx` to `cd` for consistency - Update all API references: ngx.shared -> cd.shared, ngx.log -> cd.log - Add support for RUST_LOG environment variable in logging initialization - Update documentation and test files to reflect namespace changes - Simplify CLAUDE.md project guide Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 408a502 commit 5a643d9

14 files changed

Lines changed: 344 additions & 364 deletions

File tree

CLAUDE.md

Lines changed: 74 additions & 187 deletions
Original file line numberDiff line numberDiff line change
@@ -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
13094
log_level = "info"
13195
log_folder = "./logs"
13296

133-
# 上游服务器组(用于负载均衡)
97+
# 负载均衡上游
13498
[[upstream]]
135-
name = "test_backend"
99+
name = "backend"
100+
method = "weighted_round_robin"
136101
server = [
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]]
144108
ip = "0.0.0.0"
145109
port = 8080
146-
ssl = false
147110
timeout = 30
148111

149-
# 路由配置
150112
[[host.route]]
151113
location = "/"
152114
root = "./html"
153-
index = ["index.html", "index.htm"]
154115
auto_index = true
155116

156117
[[host.route]]
157118
location = "/api"
158-
upstream = "test_backend"
119+
upstream = "backend"
159120
proxy_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`

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ run:
1313
$(CARGO) run
1414

1515
test:
16-
$(CARGO) test
16+
RUST_LOG=off $(CARGO) test
1717

1818
clean:
1919
$(CARGO) clean

config.schema.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@
129129
"type": "object",
130130
"properties": {
131131
"name": {
132-
"description": "Name of the shared dictionary (used to access via ngx.shared.name)",
132+
"description": "Name of the shared dictionary (used to access via cd.shared.name)",
133133
"type": "string",
134134
"minLength": 1
135135
},

docs/docs/config/lua.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ lua_code_cache = true # 启用代码缓存以提高性能
4141

4242
- **OpenResty API 兼容**:支持 `cd.req``cd.resp``cd.header` 等对象
4343
- **代码缓存**:支持 Lua 代码缓存以提高性能
44-
- **共享数据**:通过 `ngx.shared` 实现跨请求数据共享
44+
- **共享数据**:通过 `cd.shared` 实现跨请求数据共享
4545
- **日志系统**:集成的多级别日志记录功能
4646
- **请求/响应操作**:完整的请求和响应处理能力
4747
- **加密工具**:MD5、SHA-1、HMAC、Base64 等加密和编码函数

0 commit comments

Comments
 (0)