From 0d6f7dad043ee3cb46f725c8ead2786dad121bb3 Mon Sep 17 00:00:00 2001 From: kingecg Date: Thu, 15 Jan 2026 21:19:10 +0800 Subject: [PATCH] init --- .gitignore | 1 + Cargo.toml | 6 ++ doc/require.md | 224 +++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 3 + 4 files changed, 234 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 doc/require.md create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0ee1327 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "rhttpd" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/doc/require.md b/doc/require.md new file mode 100644 index 0000000..bccb7af --- /dev/null +++ b/doc/require.md @@ -0,0 +1,224 @@ + +# 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服务器框架 +```toml +[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引擎选项 +```toml +# 选项1: Deno核心(V8) +deno_core = "0.200" +# 选项2: QuickJS(轻量级) +rquickjs = "0.4" +# 选项3: Boa(纯Rust实现) +boa_engine = "0.17" +``` + +### 其他关键依赖 +```toml +[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. 核心组件结构 +```rust +struct ProxyServer { + config: Arc>, + sites: HashMap, + js_engine: JsEngine, + runtime: Runtime, +} + +struct Site { + hostname: String, + routes: Vec, + certificates: Option, +} + +enum RouteRule { + Static { + path_pattern: String, + directory: PathBuf, + options: StaticOptions, + }, + ReverseProxy { + path_pattern: String, + upstreams: Vec, + options: ProxyOptions, + }, + TcpProxy { + path_pattern: String, + target: SocketAddr, + protocol: ProtocolType, + }, +} +``` + +### 2. 配置系统 +```javascript +// 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: 基础框架 +1. 基本HTTP服务器 +2. 基于Host头的路由 +3. 静态文件服务 +4. 简单配置(JSON/TOML) + +### Phase 2: 代理功能 +1. 反向代理实现 +2. TCP代理基础 +3. 连接池和超时控制 + +### Phase 3: JavaScript集成 +1. 嵌入JS引擎 +2. JS配置文件支持 +3. 动态路由更新 + +### Phase 4: 高级特性 +1. SSL/TLS支持 +2. 健康检查 +3. 监控和日志 +4. 性能优化 + +## 关键难点解决方案 + +### 1. 热重载配置 +- 使用inotify/watch监听配置文件变化 +- 原子配置切换避免锁竞争 +- 优雅关闭旧连接 + +### 2. 内存安全 +- 合理使用Arc/RwLock共享配置 +- 连接数限制和超时 +- 防范DDoS攻击 + +### 3. 性能优化 +- 连接复用(keep-alive) +- 零拷贝文件传输(sendfile) +- 异步I/O和并行处理 + +## 测试要点 +1. 多站点路由正确性 +2. 代理功能完整性 +3. JS配置热更新 +4. 并发性能和内存使用 +5. 错误处理和恢复 + diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +}