这是一个用C++实现的高性能HTTP服务器,具有完整的网络编程、多线程处理、内存池、日志系统等功能。
- HTTP 1.1 协议支持
- 静态文件服务
- 自定义路由配置
- 文件描述符缓存
- 速率限制
- 线程池
- 内存池
- 日志系统
- 定时器管理
httpserver/
├── cache_config/ # 配置和文件缓存
├── httpserver/ # HTTP核心模块
├── log/ # 日志系统
├── memorypool/ # 内存池
├── net/ # 网络层(epoll等)
├── threadpool/ # 线程池
├── timer/ # 定时器
└── webserver/ # Web服务器示例
├── html/ # 静态文件
└── config.json # 配置文件
- CMake
- C++17 及以上编译器
- Linux 系统环境
cd webserver
cmake .
make./http_server_test默认使用 webserver/config.json 配置文件。
在 webserver/config.json 中可以配置:
ip: 服务器监听IPport: 服务器端口threads: 线程池线程数rate_limit_enable: 是否启用速率限制web_root: 静态文件根目录- 更多配置项详见示例文件
服务器默认包含以下页面:
- 首页: http://localhost:8081
- 2048游戏: http://localhost:8081/2048
- 404页面: 自定义错误页面
使用 wrk 工具进行压力测试(2线程,50连接,30秒):
Running 30s test @ http://localhost:8081/
2 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 3.33ms 6.35ms 92.53ms 88.99%
Req/Sec 23.07k 5.27k 33.17k 68.78%
1378504 requests in 30.11s, 4.27GB read
Requests/sec: 45786.81
Transfer/sec: 145.32MB
Running 30s test @ http://localhost:8082/
2 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.10ms 1.99ms 40.46ms 93.76%
Req/Sec 33.47k 8.77k 69.01k 77.96%
1999455 requests in 30.08s, 6.55GB read
Requests/sec: 66462.99
Transfer/sec: 222.92MB
项目采用经典的 主从Reactor 模式,主要架构如下:
-
主从 Reactor 模式
- 主 Reactor(Acceptor Loop):主线程,负责接受新连接
- 从 Reactor(Connection Loops):多个子线程,每个线程运行独立的 EventLoop,负责处理已建立连接的读写事件
- 采用轮询(Round-Robin)策略将新连接分配给从 Reactor
-
核心组件
- EventLoop: 事件循环,封装 epoll,负责事件分发和任务调度
- Epoll: Linux 多路复用 IO,高效管理大量文件描述符
- Acceptor: 接受新连接,将连接分配给子线程
- TcpConnection: 管理单个 TCP 连接的生命周期
- ThreadPool: 线程池,提供多个 EventLoop 线程
-
事件处理流程
- Acceptor 接受新连接
- 使用轮询(Round-Robin)策略分配给子线程的 EventLoop
- 连接的读写事件在分配的 EventLoop 中处理
- HTTP 解析和响应生成在对应线程中完成
-
性能优化设计
- 线程池: 多线程并发处理,充分利用多核 CPU
- 事件驱动: 非阻塞 IO + epoll,高并发连接能力
- 定时器管理: 使用哈希表实现的高效定时器
- 内存池: 减少内存分配开销
- 文件描述符缓存: 避免重复打开文件
- 响应对象池: 复用 HttpResponse 对象