# TinyWebServer **Repository Path**: lyy42995004/tiny_web_server ## Basic Information - **Project Name**: TinyWebServer - **Description**: Linux下C++轻量级Web服务器 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-14 - **Last Updated**: 2025-03-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # C++轻量级、高性能、高并发的Web服务器 ## 实现 - **Buffer**: vector\存储数据,避免频繁系统调用,实现高效自动增长的缓冲区。 - **Log**: 单例模式,支持同步直接写入,异步采用**阻塞队列**,调用**异步**线程处理。 - **SqlConnectPool**: 利用**RAII机制**实现了数据库连接池,减少数据库连接建立与关闭的开销。 - **HttpRequest**: 借助**状态机**和正则表达式解析HTTP请求,访问服务器**数据库**实现web端用户**注册、登录**功能。 - **HttpResponse**: 根据请求资源状态确定响应码,生成响应报文,支持文件映射以提高访问速度; - **HttpConnect**: 负责读写数据,调用HttpRequest解析请求,调用HttpResponse生成响应。 - **HeapTimer**: 基于**小根堆**实现定时器管理,用于处理连接超时、定时任务等场景。 - **WebServer**: **IO复用技术Epoll**与**线程池**实现多线程的**Reactor高并发模型**。 ``` WebServer :服务器逻辑框架: epoller监听+线程池读写 | | Epoller Timer :epoll操作封装, 定时器给连接计时 | | ---------- | HttpConnection :把监听连接返回的文件描述符封装成一个连接实例, 对readv, write网络数据传输进行封装, 管理连接 | | HttpRequest HttpResponse :请求操作封装,响应操作封装,业务逻辑 | | -------------- | Buffer :读写缓冲区 ``` ThreadPool : 线程池,负责读写操作(上图上两层属于主线程,下三层属于线程池) Log : 日志类 ## 环境 - Modern C++ - Ubuntu 24.04 64位 - MySql 8.0.41 - vscode - git ## 规范 **Google C++ style** ## 使用 ``` # 配置数据库 mysql -u[用户名] -p CREATE database web_server; USE web_server; CREATE TABLE User( username char(50) NULL, password char(50) NULL )ENGINE=InnoDB; INSERT INTO user(username, password) VALUES('name', 'password'); // 生成webserver mkdir build cd build cmake .. make cd .. ./webserver ``` ## 测试 - 单元测试: 对每个类的实现,进行单元测试确保代码正确性、便于维护、提高开发效率。 - 压力测试: 利用Webbench,模拟多客户端并发请求,评估服务器在高负载下的性能。 ``` cd webbench-1.5 make webbench -c 1000 -t 30 http://ip:port/ 参数: -c 表示客户端数 -t 表示时间 ``` ![image.png](https://s2.loli.net/2025/03/14/JdoqFGibNAU2OXC.png) ## 演示 ![image.png](https://s2.loli.net/2025/03/14/QhWXtEpqyYKjOa3.png) ![image.png](https://s2.loli.net/2025/03/14/LXrBoqyFCDJ192v.png) ![image.png](https://s2.loli.net/2025/03/14/bHuOlXhvzsZKk1I.png) ## 目录树 > . > │ > ├── code > │ ├── main.cc > │ ├── CMakeLists.txt > │ ├── buffer > │ ├── log > │ ├── pool > │ ├── http > │ ├── heap_timer > │ └── server > ├── tests > │ ├── CMakeLists.txt > │ ├── buffer_test.cc > │ ├── blockqueue_test.cc > │ ├── log_test.cc > │ ├── sql_connect_pool_test.cc > │ ├── http_connect_test.cc > │ ├── http_request_test.cc > │ ├── http_response_test.cc > │ └── heap_timer_test.cc > ├── resources > │ ├── css > │ ├── fonts > │ ├── images > │ ├── js > │ └── index.html > ├── log > ├── webbench-1.5 > └── README.md ## 感谢 [@qinguoyi](https://github.com/qinguoyi/TinyWebServer) [@JehanRio](https://github.com/JehanRio/TinyWebServer/)