# rhttpd - Rust HTTP Server 一个高性能、可配置的HTTP服务器,用Rust编写,支持多站点托管、多种代理类型和JavaScript动态配置。 ## 功能特性 ### ✅ 已实现 (v0.2.0) - **🏗️ 基础架构** - 完整的模块化架构 - 多站点支持 - 基于Host头的路由 - 请求日志记录 - 错误处理 - **🌐 代理功能** - 完整实现 - **反向代理** - HTTP请求转发,支持负载均衡 - **TCP代理** - 原始TCP流量转发 - **WebSocket代理** - WebSocket消息代理框架 - **连接池管理** - HTTP连接复用 - **负载均衡** - 5种算法支持 - **🔀 路由系统** - 灵活的路由匹配 - 基于路径模式匹配 (`/api/*`, `/`, `/*`) - 支持多路由规则 - 按优先级匹配 - **📁 静态文件服务** - 完整的静态文件支持 - 自动MIME类型检测 (使用 `mime_guess`) - 索引文件支持 (可配置) - 目录访问控制 - **⚙️ 配置系统** - 多格式配置支持 - **TOML格式配置** (`config.toml`) - **JSON格式配置** - 支持 - **配置验证机制** - 完整的配置验证 - **连接池配置** - 可配置连接数和超时 - **健康检查配置** - 可配置检查间隔和状态 - **🧙 JavaScript集成** - 基础支持 - JavaScript配置文件解析 - 与TOML/JSON配置集成 - 中间件执行框架 - 配置动态修改 ### 🚧 开发工具 - **完整的开发环境** - 单元测试 (7个测试通过) - 集成测试 (4个测试通过) - 代码格式化 (`cargo fmt`) - 静态检查 (`cargo clippy`) - 文档生成 - 项目结构完整 ### 📚 新增v0.2.0功能 #### TCP/WebSocket代理 ```toml [[sites."ws.example.com".routes]] type = "tcp_proxy" path_pattern = "/ws/*" target = "ws://websocket-server:8080" protocol = "websocket" # tcp, websocket, http ``` #### 连接池配置 ```toml [connection_pool] max_connections = 100 idle_timeout = 90 # 秒 ``` #### 负载均衡配置 ```toml [[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] # 可选权重配置 ``` #### 健康检查配置 ```toml [health_check] interval = 30 # 秒 timeout = 5 # 秒 path = "/health" expected_status = 200 ``` ### 🔄 升级指南 (v0.1.0 → v0.2.0) #### 配置更新 v0.2.0新增了`connection_pool`和`health_check`配置字段,如果使用自定义配置,请更新: ```toml # 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`用于服务监控 #### 行为变更 - 配置文件新增字段为可选,向后兼容 - 现有配置继续工作 - 新功能默认禁用,需显式配置 ## 快速开始 ### 安装 ```bash git clone https://github.com/yourusername/rhttpd.git cd rhttpd cargo build --release ``` ### 配置 创建配置文件 `config.toml`: ```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 ``` ### 运行 ```bash # 使用默认配置 cargo run # 使用指定配置文件 cargo run -- config.toml ``` ## 配置参考 ### 服务器配置 | 字段 | 类型 | 描述 | 默认值 | |------|------|------|--------| | `port` | `u16` | 监听端口 | 8080 | | `sites` | `HashMap` | 站点配置映射 | `{}` | | `js_config` | `Option` | JavaScript配置文件路径 | `None` | | `connection_pool` | `Option` | 连接池配置 | `None` | | `health_check` | `Option` | 健康检查配置 | `None` | ### 站点配置 | 字段 | 类型 | 描述 | |------|------|------| | `hostname` | `String` | 站点主机名 | | `routes` | `Vec` | 路由规则列表 | | `tls` | `Option` | TLS配置 | ### 路由规则 #### 静态文件 ```toml type = "static" path_pattern = "/*" # 路径模式 root = "./public" # 文件根目录 index = ["index.html"] # 索引文件列表 directory_listing = false # 是否允许目录列表 ``` #### 反向代理 ```toml type = "reverse_proxy" path_pattern = "/api/*" target = "http://backend:3000" ``` #### 增强的反向代理 (v0.2.0) ```toml [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) ```toml [[sites."ws.example.com".routes]] type = "tcp_proxy" path_pattern = "/ws/*" target = "ws://websocket-server:8080" protocol = "websocket" # tcp, websocket, http ``` ### 连接池配置 (v0.2.0) ```toml [connection_pool] max_connections = 100 # 最大连接数 idle_timeout = 90 # 空闲超时(秒) ``` ### 健康检查配置 (v0.2.0) ```toml [health_check] interval = 30 # 检查间隔(秒) timeout = 5 # 超时时间(秒) path = "/health" # 健康检查路径 expected_status = 200 # 期望的状态码 ``` ## 开发 ### 构建和测试 ```bash # 构建 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 # 变更日志 ``` ## 示例 ### 基本静态网站 ```toml 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服务器代理 ```toml 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" ``` ### 混合配置 (多后端) ```toml [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代理 ```toml [sites."ws.example.com"] [[sites."ws.example.com".routes]] type = "tcp_proxy" path_pattern = "/ws/*" target = "ws://chat-server:8080" protocol = "websocket" ``` ### 带连接池和健康检查的完整配置 ```toml 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](AGENTS.md) 了解开发指南。 ## 许可证 MIT License ## 支持 如有问题或建议,请提交Issue或Pull Request。 ## 版本 **当前版本**: v0.2.0 **发布日期**: 2025-01-15