VeTiS(Very Tiny Server)
一个为现代 Rust 应用打造的极速、极简 HTTP 服务器
VeTiS 是一个轻量级但功能强大的 Web 服务器,将简洁性与高性能融为一体。它基于 Rust 的安全性保证进行设计,提供 HTTP/1、HTTP/2 和 HTTP/3 支持,并拥有清晰直观的 API,让构建 Web 服务变得轻而易举。
历史
VeTiS 最初是 deboa-tests 的一个组件,deboa-tests 是一个由 deboa http 客户端用于集成测试的私有 crate。随着它获得了更多功能,例如 HTTP1/2 和 3 支持以及 TLS,我意识到该项目可以在某种程度上被复用。
因此,出于可复用性的考虑,我启动了 EasyHttpMock,一个旨在为集成目的提供快速简便的 mock 服务器启动方式的项目。很快我就意识到,EasyHttpMock 内部使用的这个 http 服务器不仅可以用作 mock 服务器,还可以用于其他目的。
这就是 VeTiS 诞生的原因。通过利用我在 deboa-tests 中为测试目的所启动的工作,它转变为一个完整的 http 服务器项目,其目标是使其非常灵活,同时保持小巧和快速。
为什么选择 VeTiS?
- 极简设计:专注于核心——高效处理 HTTP 请求
- 灵活的运行时:在 Tokio 或 Smol 异步运行时之间进行选择
- 协议支持:完整的 HTTP/1、HTTP/2 和 HTTP/3 实现
- 默认安全:内置支持现代密码学的 TLS
- 零成本抽象:利用 Rust 的性能且无额外开销
- 特性门控:仅包含所需功能以实现最优的二进制大小
快速开始
将 VeTiS 添加到您的 Cargo.toml:
vetis = { version = "0.1.0" }
运行时
Crate 特性
- http1 (default)
- http2
- http3
- rust-tls (default)
外部 crate
- static-files
- reverse-proxy
- auth
使用示例
使用 VeTiS 创建 Web 服务器非常简单:
use http::Version;
use hyper::StatusCode;
use vetis::{
listener::ListenerConfig,
security::SecurityConfig,
server::{ServerConfig},
virtual_host::{handler_fn, VirtualHostConfig},
};
use vetis_macros::status_pages;
use vetis_tokio::{
virtual_host::{path::HandlerPath, VirtualHostImpl},
Vetis,
};
pub(crate) const CA_CERT: &[u8] = include_bytes!("../../certs/ca.der");
pub(crate) const SERVER_CERT: &[u8] = include_bytes!("../../certs/server.der");
pub(crate) const SERVER_KEY: &[u8] = include_bytes!("../../certs/server.key.der");
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_env(env_logger::Env::default().filter_or("RUST_LOG", "error")).init();
let https = ListenerConfig::builder()
.port(8443)
.protocol_version(Version::HTTP_11)
.interface("0.0.0.0")
.build()?;
let config = ServerConfig::builder()
.add_listener(https)
.build()?;
let security_config = SecurityConfig::builder()
.ca_cert_from_bytes(CA_CERT.to_vec())
.cert_from_bytes(SERVER_CERT.to_vec())
.key_from_bytes(SERVER_KEY.to_vec())
.build()?;
let localhost_config = VirtualHostConfig::builder()
.hostname("localhost")
.port(8443)
.security(security_config)
.root_directory("/home/rogerio/Downloads")
.status_pages(maplit::hashmap! {
404 => "404.html".to_string(),
500 => "500.html".to_string(),
})
.build()?;
let mut localhost_virtual_host = VirtualHostImpl::new(localhost_config);
let root_path = HandlerPath::builder()
.uri("/hello")
.handler(handler_fn(|_request| async move {
let response = vetis::Response::builder()
.status(StatusCode::OK)
.text("Hello from localhost");
Ok(response)
}))
.build()?;
localhost_virtual_host.add_path(root_path);
let health_path = HandlerPath::builder()
.uri("/health")
.handler(handler_fn(|_request| async move {
let response = vetis::Response::builder()
.status(StatusCode::OK)
.text("Health check");
Ok(response)
}))
.build()?;
localhost_virtual_host.add_path(health_path);
let mut server = Vetis::new(config);
server
.add_virtual_host(localhost_virtual_host)
.await;
server.run().await?;
server
.stop()
.await?;
Ok(())
}
概述
核心功能
- 独立服务器 - 作为独立的 HTTP/HTTPS 服务器运行
- 多协议 - 默认禁用对 HTTP/1、HTTP/2 和 HTTP/3 的支持
- 虚拟主机 - 在单个服务器上托管多个域名
- SNI 支持 - TLS 的服务器名称指示
- 反向代理 - 将请求路由到后端服务(功能受控,默认禁用)
内容与安全
- 身份验证 - 支持多种身份验证方法
- 授权 - 细粒度访问控制
- 动态内容 - 模板渲染和内容生成
- 日志记录 - 全面的请求和错误日志
- 静态文件服务 - 高效的静态资源分发
语言
- Python - 支持 ASGI/WSGI/RSGI 应用程序
- PHP - 支持 PHP 应用程序
- Ruby - 支持 Ruby 应用程序
路线图
VeTiS 正在不断演进!以下是我们正在开发的内容:
额外功能
- WebSockets - 实时双向通信
- 负载均衡 - 在多台服务器之间分发流量
子项目
vetis
HTTP 服务器的核心创建。
vetis-macros
VeTiS 的宏,便于创建小型 HTTP 服务器。
vetis-interface
VeTiS 的接口,便于创建小型 HTTP 服务器。
vetis-proxy
VeTiS 的反向代理支持。
vetis-static
VeTiS 的静态文件支持。
vetis-smol
VeTiS 的 Smol 运行时。
vetis-tokio
VeTiS 的 Tokio 运行时。
基准测试
请参阅 BENCHMARKS.md 以获取详细的基准测试结果。
许可证
可选择以下任一许可证:
- Apache License, Version 2.0 (LICENSE-APACHE 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
由您自行选择。
作者
Rogerio Pereira Araujo rogerio.araujo@gmail.com