9.7 KiB
9.7 KiB
rhttpd - Rust HTTP Server
一个高性能、可配置的HTTP服务器,用Rust编写,支持多站点托管、多种代理类型和JavaScript动态配置。
功能特性
✅ 已实现 (v0.2.0)
-
🏗️ 基础架构 - 完整的模块化架构
- 多站点支持
- 基于Host头的路由
- 请求日志记录
- 错误处理
-
🌐 代理功能 - 完整实现
- 反向代理 - HTTP请求转发,支持负载均衡
- TCP代理 - 原始TCP流量转发
- WebSocket代理 - WebSocket消息代理框架
- 连接池管理 - HTTP连接复用
- 负载均衡 - 5种算法支持
-
🔀 路由系统 - 灵活的路由匹配
- 基于路径模式匹配 (
/api/*,/,/*) - 支持多路由规则
- 按优先级匹配
- 基于路径模式匹配 (
-
📁 静态文件服务 - 完整的静态文件支持
- 自动MIME类型检测 (使用
mime_guess) - 索引文件支持 (可配置)
- 目录访问控制
- 自动MIME类型检测 (使用
-
⚙️ 配置系统 - 多格式配置支持
- TOML格式配置 (
config.toml) - JSON格式配置 - 支持
- 配置验证机制 - 完整的配置验证
- 连接池配置 - 可配置连接数和超时
- 健康检查配置 - 可配置检查间隔和状态
- TOML格式配置 (
-
🧙 JavaScript集成 - 基础支持
- JavaScript配置文件解析
- 与TOML/JSON配置集成
- 中间件执行框架
- 配置动态修改
🚧 开发工具
- 完整的开发环境
- 单元测试 (7个测试通过)
- 集成测试 (4个测试通过)
- 代码格式化 (
cargo fmt) - 静态检查 (
cargo clippy) - 文档生成
- 项目结构完整
📚 新增v0.2.0功能
TCP/WebSocket代理
[[sites."ws.example.com".routes]]
type = "tcp_proxy"
path_pattern = "/ws/*"
target = "ws://websocket-server:8080"
protocol = "websocket" # tcp, websocket, http
连接池配置
[connection_pool]
max_connections = 100
idle_timeout = 90 # 秒
负载均衡配置
[[sites."api.example.com".routes]]
type = "reverse_proxy"
path_pattern = "/api/*"
target = "http://primary-backend"
[sites."api.example.com".routes.load_balancer]
strategy = "least_connections" # round_robin, least_connections, weighted_round_robin, ip_hash, random
upstreams = [
"http://backend1:3000",
"http://backend2:3000",
"http://backend3:3000"
]
weights = [3, 2, 1] # 可选权重配置
健康检查配置
[health_check]
interval = 30 # 秒
timeout = 5 # 秒
path = "/health"
expected_status = 200
🔄 升级指南 (v0.1.0 → v0.2.0)
配置更新
v0.2.0新增了connection_pool和health_check配置字段,如果使用自定义配置,请更新:
# v0.1.0 配置
port = 8080
[sites."example.com"]
# v0.2.0 配置 (新增字段)
port = 8080
[sites."example.com"]
[connection_pool]
max_connections = 100
idle_timeout = 90
[health_check]
interval = 30
timeout = 5
path = "/health"
expected_status = 200
API变更
- TCP代理: 新增
TcpProxyManager和相关功能 - 连接池: 新增
ConnectionPool用于HTTP连接管理 - 负载均衡: 新增
LoadBalancer支持多种算法 - 健康检查: 新增
HealthChecker用于服务监控
行为变更
- 配置文件新增字段为可选,向后兼容
- 现有配置继续工作
- 新功能默认禁用,需显式配置
快速开始
安装
git clone https://github.com/yourusername/rhttpd.git
cd rhttpd
cargo build --release
配置
创建配置文件 config.toml:
port = 8080
sites."example.com".hostname = "example.com"
[[sites."example.com".routes]]
type = "static"
path_pattern = "/*"
root = "./public"
index = ["index.html"]
[[sites."example.com".routes]]
type = "reverse_proxy"
path_pattern = "/api/*"
target = "http://localhost:3000"
# 新增:连接池配置
[connection_pool]
max_connections = 100
idle_timeout = 90
# 新增:健康检查配置
[health_check]
interval = 30
timeout = 5
path = "/health"
expected_status = 200
运行
# 使用默认配置
cargo run
# 使用指定配置文件
cargo run -- config.toml
配置参考
服务器配置
| 字段 | 类型 | 描述 | 默认值 |
|---|---|---|---|
port |
u16 |
监听端口 | 8080 |
sites |
HashMap<String, SiteConfig> |
站点配置映射 | {} |
js_config |
Option<String> |
JavaScript配置文件路径 | None |
connection_pool |
Option<ConnectionPoolConfig> |
连接池配置 | None |
health_check |
Option<HealthCheckConfig> |
健康检查配置 | None |
站点配置
| 字段 | 类型 | 描述 |
|---|---|---|
hostname |
String |
站点主机名 |
routes |
Vec<RouteRule> |
路由规则列表 |
tls |
Option<TlsConfig> |
TLS配置 |
路由规则
静态文件
type = "static"
path_pattern = "/*" # 路径模式
root = "./public" # 文件根目录
index = ["index.html"] # 索引文件列表
directory_listing = false # 是否允许目录列表
反向代理
type = "reverse_proxy"
path_pattern = "/api/*"
target = "http://backend:3000"
增强的反向代理 (v0.2.0)
[sites."api.example.com".routes]]
type = "reverse_proxy"
path_pattern = "/api/*"
target = "http://primary-backend"
[sites."api.example.com".routes.load_balancer]
strategy = "least_connections"
upstreams = [
"http://backend1:3000",
"http://backend2:3000"
]
weights = [3, 2, 1] # 权重:backend1=3, backend2=2, backend3=1
TCP代理 (v0.2.0)
[[sites."ws.example.com".routes]]
type = "tcp_proxy"
path_pattern = "/ws/*"
target = "ws://websocket-server:8080"
protocol = "websocket" # tcp, websocket, http
连接池配置 (v0.2.0)
[connection_pool]
max_connections = 100 # 最大连接数
idle_timeout = 90 # 空闲超时(秒)
健康检查配置 (v0.2.0)
[health_check]
interval = 30 # 检查间隔(秒)
timeout = 5 # 超时时间(秒)
path = "/health" # 健康检查路径
expected_status = 200 # 期望的状态码
开发
构建和测试
# 构建
cargo build
# 构建(优化)
cargo build --release
# 测试
cargo test
# 运行单个测试
cargo test test_name
# 运行测试并输出
cargo test -- --nocapture
# 代码检查
cargo check
# 代码格式化
cargo fmt
# 运行clippy lints
cargo clippy
# 运行clippy(所有目标)
cargo clippy --all-targets --all-features
# 生成文档
cargo doc --open
# 清理构建产物
cargo clean
项目结构
rhttpd/
├── src/
│ ├── main.rs # 应用程序入口
│ ├── lib.rs # 库根
│ ├── config/ # 配置管理
│ │ └── mod.rs
│ ├── server/ # 服务器实现
│ │ └── mod.rs
│ ├── proxy/ # 代理功能
│ │ ├── mod.rs
│ │ ├── tcp_proxy.rs # TCP/WebSocket代理
│ │ ├── connection_pool.rs # 连接池管理
│ │ ├── load_balancer.rs # 负载均衡
│ │ └── health_check.rs # 健康检查
│ └── js_engine/ # JavaScript集成
│ └── mod.rs
├── tests/ # 集成测试
├── doc/ # 文档和需求
├── public/ # 静态文件示例
├── static/ # 静态文件示例
├── config.toml # 配置示例
├── config.js # JavaScript配置示例
├── README.md # 项目文档
├── AGENTS.md # 开发者指南
├── roadmap.md # 开发路线图
└── CHANGELOG.md # 变更日志
示例
基本静态网站
port = 8080
[sites."mysite.com"]
hostname = "mysite.com"
[[sites."mysite.com".routes]]
type = "static"
path_pattern = "/*"
root = "./www"
index = ["index.html"]
directory_listing = false
API服务器代理
port = 8080
[sites."api.example.com"]
hostname = "api.example.com"
[[sites."api.example.com".routes]]
type = "reverse_proxy"
path_pattern = "/v1/*"
target = "http://backend:3001"
混合配置 (多后端)
[sites."example.com"]
[[sites."example.com".routes]]
type = "static"
path_pattern = "/static/*"
root = "./assets"
[[sites."example.com".routes]]
type = "static"
path_pattern = "/"
root = "./public"
index = ["index.html"]
[[sites."example.com".routes]]
type = "reverse_proxy"
path_pattern = "/api/*"
target = "http://backend:3000"
[sites."example.com".routes.load_balancer]
strategy = "least_connections"
upstreams = ["http://backend1:3000", "http://backend2:3000"]
TCP/WebSocket代理
[sites."ws.example.com"]
[[sites."ws.example.com".routes]]
type = "tcp_proxy"
path_pattern = "/ws/*"
target = "ws://chat-server:8080"
protocol = "websocket"
带连接池和健康检查的完整配置
port = 8080
[connection_pool]
max_connections = 100
idle_timeout = 90
[health_check]
interval = 30
timeout = 5
path = "/health"
expected_status = 200
[sites."api.example.com"]
[[sites."api.example.com".routes]]
type = "reverse_proxy"
path_pattern = "/api/*"
[sites."api.example.com".routes.load_balancer]
strategy = "weighted_round_robin"
upstreams = [
"http://backend1:3000",
"http://backend2:3000",
"http://backend3:3000"
]
weights = [5, 3, 2] # backend1权重最高
性能
rhttpd基于以下高性能Rust库构建:
tokio- 异步运行时axum- HTTP框架hyper- HTTP实现reqwest- HTTP客户端tower- 中间件和服务抽象
贡献
欢迎贡献代码!请查看 AGENTS.md 了解开发指南。
许可证
MIT License
支持
如有问题或建议,请提交Issue或Pull Request。
版本
当前版本: v0.2.0
发布日期: 2025-01-15