init
This commit is contained in:
commit
0d6f7dad04
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "rhttpd"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
|
@ -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<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. 配置系统
|
||||||
|
```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. 错误处理和恢复
|
||||||
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
fn main() {
|
||||||
|
println!("Hello, world!");
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue