- Linux轻量级HTTP服务器,实现HTTP GET/POST请求解析与响应
- 使用Reactor模型、非阻塞IO、epoll多路复用、线程池相结合的并发模型
- 使用vector封装自动增长缓冲区,缓解IO系统调用,提高数据读写性能
- 使用queue封装定时事件,实现最小堆定时器,关闭超时非活动连接
- 使用MySQL及数据库连接池,实现web端用户注册与登录
- 使用deque封装阻塞队列,实现同步/异步日志系统,记录服务器运行状态
- 参考了@qinguoyi 和 @JehanRio . Thanks for help. ❤
- 压力测试记录/test 5000 clients 30 seconds.
- Windows Subsystem for Linux - Ubuntu 24.04 LTS & Visual Studio Code
一个基于C++11的高性能Web服务器学习项目,采用Reactor模式实现,支持高并发连接处理,主要用于理解Web服务器的实现原理
- 高并发处理: 基于epoll的I/O多路复用,支持ET/LT模式
- 线程池: 使用C++11线程池处理HTTP请求,提高并发性能
- 连接池: MySQL数据库连接池,支持数据库操作
- 定时器: 基于小根堆的定时器,自动清理超时连接
- 日志系统: 异步日志系统,支持多级别日志输出
- HTTP解析: 完整的HTTP请求/响应解析和生成
- 缓冲区: 自定义缓冲区类,支持高效的数据读写
- 优雅关闭: 支持优雅关闭服务器
-
Web服务器 (Web_Server)
- 主服务器类,负责初始化和启动服务器
- 支持端口配置、触发模式选择、超时设置等
-
HTTP连接处理 (Http_Conn)
- 处理客户端HTTP连接
- 支持请求解析和响应生成
- 实现Keep-Alive连接复用
-
I/O多路复用 (Epoller)
- 基于epoll的事件驱动模型
- 支持ET/LT两种触发模式
- 高效处理大量并发连接
-
线程池 (Thread_Pool)
- 基于C++11的线程池实现
- 任务队列管理,支持动态任务分配
- 线程安全的任务执行
-
数据库连接池 (Sql_Conn_Pool)
- MySQL连接池管理
- RAII模式自动资源管理
- 支持连接复用和自动回收
-
定时器 (Heap_Timer)
- 基于小根堆的定时器实现
- 支持定时任务和超时检测
- 自动清理过期连接
-
日志系统 (Log)
- 异步日志写入
- 多级别日志支持 (DEBUG/INFO/WARN/ERROR)
- 线程安全的日志输出
-
缓冲区 (Buffer)
- 自定义缓冲区实现
- 支持高效的数据读写操作
- 自动内存管理
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 客户端请求 │───▶│ Web_Server │───▶│ Epoller │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Thread_Pool │ │ Http_Conn │
└─────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Sql_Conn_Pool │ │ Heap_Timer │
└─────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ MySQL │ │ Log │
└─────────────────┘ └─────────────────┘
- 操作系统: Linux (推荐Ubuntu 18.04+)
- 编译器: GCC 7.0+ (支持C++14)
- 数据库: MySQL 5.7+
- 依赖库:
- pthread (线程库)
- mysqlclient (MySQL客户端库)
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install libmysqlclient-dev
# CentOS/RHEL
sudo yum install gcc-c++ make
sudo yum install mysql-devel# 登录MySQL
mysql -u root -p
# 创建数据库
CREATE DATABASE httpwebserver;
# 使用数据库
USE httpwebserver;
# 执行初始化脚本
SOURCE /path/to/HttpWebServer/init.sql;-- 创建数据库
CREATE DATABASE httpwebserver;
-- 创建用户 (可选)
CREATE USER 'suzune'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON httpwebserver.* TO 'suzune'@'localhost';
FLUSH PRIVILEGES;
-- 使用数据库
USE httpwebserver;
-- 创建用户表
CREATE TABLE `user` (
`username` char(50) DEFAULT NULL,
`password` char(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- 插入测试数据
INSERT INTO `user` VALUES ('Chieko3020','123456'),('suzune','123456'),('3226010143','123456');# 克隆项目
git clone <https://github.com/Chieko3020/HttpWebServer>
cd HttpWebServer
# 编译
make
# 清理编译文件
make clean在 code/main.cpp 中可以修改服务器配置:
Web_Server server(
3020, 3, 60000, false, // 端口 ET模式 timeoutMs 优雅退出
3306, "suzune", "123456", "httpwebserver", // MySQL配置
12, 6, true, 1, 1024); // 连接池数量 线程池数量 日志开关 日志等级 日志异步队列容量- 端口: 服务器监听端口 (默认3020)
- 触发模式: 1=LT, 3=ET (默认ET模式)
- 超时时间: 连接超时时间,单位毫秒 (默认60000ms)
- 优雅退出: 是否启用优雅关闭 (默认false)
- MySQL配置: 数据库端口、用户名、密码、数据库名
- 连接池数量: MySQL连接池大小 (默认12)
- 线程池数量: 工作线程数量 (默认6)
- 日志开关: 是否启用日志 (默认true)
- 日志等级: 0=DEBUG, 1=INFO, 2=WARN, 3=ERROR (默认1)
- 日志队列容量: 异步日志队列大小 (默认1024)
# 启动服务器
./server项目使用MySQL数据库存储用户信息,主要包含以下表:
| 字段名 | 类型 | 说明 |
|---|---|---|
| username | char(50) | 用户名 |
| password | char(50) | 密码 |
数据库初始化脚本 init.sql 包含以下测试用户:
- 用户名:
Chieko3020, 密码:123456 - 用户名:
suzune, 密码:123456 - 用户名:
3226010143, 密码:123456
init.sql: 数据库初始化脚本,包含表结构和测试数据
启动服务器后,可以通过浏览器访问:
- 主页: http://localhost:3020
- 登录页面: http://localhost:3020/login.html
- 注册页面: http://localhost:3020/register.html
使用上述测试账号可以登录系统进行功能测试。
项目包含webbench压力测试工具:
# 进入测试目录
cd webbench-1.5
# 编译测试工具
make
# 运行压力测试
./webbench -c 1000 -t 10 http://localhost:3020/参数说明:
-c 1000: 1000个并发连接-t 10: 测试持续10秒
HttpWebServer/
├── code/ # 源代码目录
│ ├── main.cpp # 主程序入口
│ ├── server/ # 服务器核心模块
│ │ ├── webserver.h # Web服务器类
│ │ ├── webserver.cpp
│ │ └── epoller.h # epoll封装
│ ├── http/ # HTTP处理模块
│ │ ├── httpconn.h # HTTP连接类
│ │ ├── httprequest.h # HTTP请求解析
│ │ └── httpresponse.h # HTTP响应生成
│ ├── pool/ # 池化模块
│ │ ├── threadpool.h # 线程池
│ │ └── sqlconnpool.h # 数据库连接池
│ ├── timer/ # 定时器模块
│ │ └── heaptimer.h # 堆定时器
│ ├── log/ # 日志模块
│ │ ├── log.h # 日志类
│ │ └── blockqueue.h # 阻塞队列
│ └── buffer/ # 缓冲区模块
│ └── buffer.h # 缓冲区类
├── resources/ # 静态资源目录
│ ├── index.html # 主页
│ ├── login.html # 登录页面
│ ├── register.html # 注册页面
│ └── ... # 其他静态文件
├── log/ # 日志文件目录
├── test/ # 测试文件目录
├── webbench-1.5/ # 压力测试工具
├── init.sql # 数据库初始化脚本
├── Makefile # 编译配置
└── README.md # 项目说明