一个面向学习与实践的 Linux 高性能 C++ WebServer 项目。项目以 epoll + 线程池 + MySQL 连接池为核心,支持 HTTP/1.1 静态文件服务、图片/视频传输、sendfile 零拷贝发送,以及基于表单的注册与登录。
- 利用IO复用技术Epoll与线程池实现多线程的Reactor高并发模型;
- 请求解析采用状态机,支持增量读取解析HTTP请求报文;
- 静态文件响应使用
sendfile,减少用户态和内核态之间的拷贝; - 数据库访问通过
SqlConnPool+SqlConnRAII管理,便于控制 MySQL 连接生命周期; - 线程池负责耗时工作,主线程保持事件调度和连接管理的轻量化;
- 使用阻塞队列实现异步日志系统,将磁盘 I/O 与请求处理线程解耦;
- 采用队列+哈希表实现定时器,定时关闭超时非活动连接;
- 提供了可直接访问的静态站点,方便测试图片、视频、表单和 keep-alive;
- C++17
- Linux
- epoll
- MySQL C API
- sendfile
- 线程池
- 定时器/连接超时回收
- Buffer + 状态机式 HTTP 解析
cmake -S . -B build
cmake --build build -j生成的可执行文件位于 build/webserver。
./build/webserver 8080 www参数说明:
- 第 1 个参数:监听端口
- 第 2 个参数:静态站点根目录
可选的 MySQL 环境变量:
WEBSERVER_MYSQL_HOSTWEBSERVER_MYSQL_PORTWEBSERVER_MYSQL_USERWEBSERVER_MYSQL_PASSWORDWEBSERVER_MYSQL_DBWEBSERVER_MYSQL_POOL_SIZE
项目默认使用 webserver 数据库和如下 user 表:
create database webserver;
use webserver;
create table user(
username char(50) null,
password char(50) null
) engine=InnoDB;注册和登录表单会通过 MySQL 连接池进行数据库访问:
- 注册:先查重,再插入
- 登录:按用户名查询并比对密码
项目自带一个可直接用于测试的静态站点:
- 首页:介绍项目定位和关键能力
- 画廊页:包含多张图片和一个视频,用于验证大文件静态传输
- 注册页:POST 到
/register - 登录页:POST 到
/login - 成功页:
welcome.html - 失败页:
error.html
- 访问
/index.html - 访问
/gallery.html - 打开图片和视频资源
- 提交注册表单
- 提交登录表单
OS: Ubuntu 24.04.4 LTS
Kernel: 6.17.0-20-generic
Virtualization: vmware
CPU: AMD Ryzen 7 4800H with Radeon Graphics
CPU Cores: 8 vCPUs
Memory: 7.7Gi
wrk -c 500 -d 30s -t 4 http://127.0.0.1:8080
Requests/sec: 95376.13
Transfer/sec: 290.25MB