4.6 KiB
4.6 KiB
Rust HTTP服务器实现需求
项目概述
使用Rust实现一个高性能、可配置的HTTP服务器,支持多站点托管、多种代理类型和JavaScript动态配置。
核心功能需求
1. 多站点支持
- 在单个端口(如80/443)上服务多个独立站点
- 基于HTTP
Host头部进行站点路由 - 每个站点有独立配置和资源隔离
2. 路径配置系统
站点配置示例结构:
{
"example.com": {
"/api/*": "反向代理到 http://backend:3000",
"/static/*": "静态目录 ./public",
"/blog": "正向代理处理",
"/ws/*": "TCP代理到 ws://chat-server:8080"
}
}
3. 请求处理类型
-
静态资源服务:
- 文件系统映射
- MIME类型自动识别
- 缓存控制头支持
- 目录列表(可选)
-
反向代理:
- 支持HTTP/HTTPS后端
- 连接池管理
- 请求/响应头重写
- 负载均衡(轮询/最少连接)
-
正向代理:
- CONNECT方法支持
- 认证机制
- 访问控制列表
-
TCP代理:
- 原始TCP流量转发
- WebSocket协议支持
- 自定义协议代理
4. JavaScript配置引擎
- 嵌入V8/Deno或QuickJS引擎
- 支持热重载配置
- 配置验证和错误报告
- 运行时动态路由修改
技术栈建议
HTTP服务器框架
[dependencies]
# 选择以下之一作为基础:
tokio = { version = "1.0", features = ["full"] }
async-std = "1.0"
# HTTP库
hyper = "1.0"
warp = "0.3"
axum = "0.7"
# 或更底层的
tower = "0.4"
JavaScript引擎选项
# 选项1: Deno核心(V8)
deno_core = "0.200"
# 选项2: QuickJS(轻量级)
rquickjs = "0.4"
# 选项3: Boa(纯Rust实现)
boa_engine = "0.17"
其他关键依赖
[dependencies]
# 配置管理
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
toml = "0.7"
# 静态文件服务
tower-http = { version = "0.4", features = ["fs", "trace"] }
mime_guess = "2.0"
# 代理功能
hyper-reverse-proxy = "0.5"
reqwest = { version = "0.11", features = ["json"] }
# TCP处理
tokio-util = { version = "0.7", features = ["codec"] }
tokio-native-tls = "0.3"
# 路由
matchit = "0.7"
regex = "1.0"
架构设计要点
1. 核心组件结构
struct ProxyServer {
config: Arc<RwLock<ServerConfig>>,
sites: HashMap<String, Site>,
js_engine: JsEngine,
runtime: Runtime,
}
struct Site {
hostname: String,
routes: Vec<RouteRule>,
certificates: Option<TlsConfig>,
}
enum RouteRule {
Static {
path_pattern: String,
directory: PathBuf,
options: StaticOptions,
},
ReverseProxy {
path_pattern: String,
upstreams: Vec<Upstream>,
options: ProxyOptions,
},
TcpProxy {
path_pattern: String,
target: SocketAddr,
protocol: ProtocolType,
},
}
2. 配置系统
// config.js 示例
export default {
port: 8080,
sites: {
"api.example.com": {
"/v1/*": {
type: "reverse_proxy",
target: "http://localhost:3001",
rewrite: {
"^/v1": "/api/v1"
}
}
},
"static.example.com": {
"/*": {
type: "static",
root: "./static",
index: ["index.html"]
}
}
},
// JavaScript中间件
middleware: async function(req) {
console.log(`Request: ${req.method} ${req.url}`);
return null; // 返回null继续处理,或返回Response直接响应
}
}
3. 请求处理流程
请求接收 → 解析Host头 → 查找站点配置 → 匹配路由规则 →
JavaScript中间件处理 → 执行对应处理器 → 返回响应
实现优先级建议
Phase 1: 基础框架
- 基本HTTP服务器
- 基于Host头的路由
- 静态文件服务
- 简单配置(JSON/TOML)
Phase 2: 代理功能
- 反向代理实现
- TCP代理基础
- 连接池和超时控制
Phase 3: JavaScript集成
- 嵌入JS引擎
- JS配置文件支持
- 动态路由更新
Phase 4: 高级特性
- SSL/TLS支持
- 健康检查
- 监控和日志
- 性能优化
关键难点解决方案
1. 热重载配置
- 使用inotify/watch监听配置文件变化
- 原子配置切换避免锁竞争
- 优雅关闭旧连接
2. 内存安全
- 合理使用Arc/RwLock共享配置
- 连接数限制和超时
- 防范DDoS攻击
3. 性能优化
- 连接复用(keep-alive)
- 零拷贝文件传输(sendfile)
- 异步I/O和并行处理
测试要点
- 多站点路由正确性
- 代理功能完整性
- JS配置热更新
- 并发性能和内存使用
- 错误处理和恢复