Skip to content

wang606/WebServer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WebServer

一个面向学习与实践的 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_HOST
  • WEBSERVER_MYSQL_PORT
  • WEBSERVER_MYSQL_USER
  • WEBSERVER_MYSQL_PASSWORD
  • WEBSERVER_MYSQL_DB
  • WEBSERVER_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

测试建议

1. 浏览器功能验证

  • 访问 /index.html
  • 访问 /gallery.html
  • 打开图片和视频资源
  • 提交注册表单
  • 提交登录表单

2. 静态压测

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

参考项目

About

一个面向学习与实践的 Linux 高性能 C++ WebServer 项目

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors