# linux_webserver **Repository Path**: Howl144/linux_webserver ## Basic Information - **Project Name**: linux_webserver - **Description**: Linux下C++轻量级Web服务器 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-03-14 - **Last Updated**: 2024-09-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README TinyWebServer =============== Linux下C++轻量级Web服务器,搭建属于自己的服务器. * 使用 **异步日志 + 数据库连接池 + 线程池 + 定时器处理非活动连接 + 非阻塞Socket+EPOLL(ET<均实现) + IO事件处理模型(Reactor和同步IO模拟Proactor均实现)+ 半同步半反应堆并发模型。** 的并发模型 * 使用**状态机**解析HTTP请求报文,支持解析**GET和POST**请求 * 访问服务器数据库实现web端用户**注册、登录**功能,可以请求服务器**图片和视频文件** * 实现**同步/异步日志系统**,记录服务器运行状态 * 经Webbench压力测试**在2核2G内存的环境下**可以实现**4000的并发连接**数据交换。 压力测试(2核,2G内存环境下) ------------------------- > * Proactor,LT + ET,12504 QPS ![test](/root/proactor.png) > * Reactor,LT + ET,12268 QPS ![test](/root/reactor.png) > * 并发连接总数:4000 (受服务器硬件影响,webbench fork到4750时服务器资源受限不能继续fork,所以这里只设置4000个并发量) > * 访问服务器时间:5s > * 所有访问均成功 更新日志 ------- - [y] 解决请求服务器上大文件的Bug - [x] 增加请求视频文件的页面 - [x] 实现非阻塞模式下的ET和LT触发,并完成压力测试 - [x] 完善`lock.h`中的封装类,统一使用该同步机制 - [x] 改进代码结构,更新局部变量懒汉单例模式 - [x] 优化数据库连接池信号量与代码结构 - [x] 使用RAII机制优化数据库连接的获取与释放 - [x] 优化代码结构,封装工具类以减少全局变量 - [x] 编译一次即可,命令行进行个性化测试更加友好 - [x] 新增命令行日志开关,关闭日志后更新压力测试结果 - [x] 改进连接池获取方式,提高并发量 - [x] 新增Reactor模式,并完成压力测试 快速运行 ------------ * 服务器测试环境 * Ubuntu版本16.04 * MySQL版本5.7.29 * 浏览器测试环境 * Windows、Linux均可 * Chrome * FireFox * 其他浏览器暂无测试 * 测试前确认已安装MySQL数据库 ```C++ // 建立yourdb库 create database yourdb; // 创建user表 USE yourdb; CREATE TABLE user( username char(50) NULL, passwd char(50) NULL )ENGINE=InnoDB; // 添加数据 INSERT INTO user(username, passwd) VALUES('name', 'passwd'); ``` * 修改main.cpp中的数据库初始化信息 ```C++ //数据库登录名,密码,库名 string user = "user"; string passwd = "passwd"; string databasename = "yourdb"; ``` * build ```C++ sh ./build.sh ``` * 启动server ```C++ ./run.sh ``` * 浏览器端 ```C++ ip:9006 ``` 测试示例命令与含义 ---------------- ```C++ ./server -p 9006 -l 1 -m 0 -o 1 -s 8 -t 8 -c 0 -a 1 ``` * -p,自定义端口号 * 默认9006 * -l,选择日志写入方式,默认同步写入 * 0,同步写入 * 1,异步写入 * -m,listenfd和connfd的模式组合,默认使用LT + LT * 0,表示使用LT + LT * 1,表示使用LT + ET * 2,表示使用ET + LT * 3,表示使用ET + ET * -o,优雅关闭连接,默认不使用 * 0,不使用 * 1,使用 * -s,数据库连接数量 * 默认为8 * -t,线程数量 * 默认为8 * -c,关闭日志,默认打开 * 0,打开日志 * 1,关闭日志 * -a,选择反应堆模型,默认Proactor * 0,Proactor模型 * 1,Reactor模型 致谢 ------------ 感谢《Linux高性能服务器编程游双著》对本项目的理论支持! 感谢微信公众号《两猿社》社长对本项目的技术支持!