Skip to content

Lixifu/httpserver

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HttpServer - 一个简单的C++ HTTP服务器

项目简介

这是一个用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: 服务器监听IP
  • port: 服务器端口
  • threads: 线程池线程数
  • rate_limit_enable: 是否启用速率限制
  • web_root: 静态文件根目录
  • 更多配置项详见示例文件

示例页面

服务器默认包含以下页面:

性能测试

使用 wrk 工具进行压力测试(2线程,50连接,30秒):

HttpServer

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

Nginx (对比)

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 模式,主要架构如下:

  1. 主从 Reactor 模式

    • 主 Reactor(Acceptor Loop):主线程,负责接受新连接
    • 从 Reactor(Connection Loops):多个子线程,每个线程运行独立的 EventLoop,负责处理已建立连接的读写事件
    • 采用轮询(Round-Robin)策略将新连接分配给从 Reactor
  2. 核心组件

    • EventLoop: 事件循环,封装 epoll,负责事件分发和任务调度
    • Epoll: Linux 多路复用 IO,高效管理大量文件描述符
    • Acceptor: 接受新连接,将连接分配给子线程
    • TcpConnection: 管理单个 TCP 连接的生命周期
    • ThreadPool: 线程池,提供多个 EventLoop 线程
  3. 事件处理流程

    1. Acceptor 接受新连接
    2. 使用轮询(Round-Robin)策略分配给子线程的 EventLoop
    3. 连接的读写事件在分配的 EventLoop 中处理
    4. HTTP 解析和响应生成在对应线程中完成
  4. 性能优化设计

    • 线程池: 多线程并发处理,充分利用多核 CPU
    • 事件驱动: 非阻塞 IO + epoll,高并发连接能力
    • 定时器管理: 使用哈希表实现的高效定时器
    • 内存池: 减少内存分配开销
    • 文件描述符缓存: 避免重复打开文件
    • 响应对象池: 复用 HttpResponse 对象

About

一个c++的简易http服务器,在压力测试中达到50%nginx的性能

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors