# TinyWebServer
**Repository Path**: angular001/TinyWebServer
## Basic Information
- **Project Name**: TinyWebServer
- **Description**: Linux下C++轻量级Web服务器 && A C++ Lightweight WebServer under Linux
- **Primary Language**: C++
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 4
- **Created**: 2020-11-03
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
TinyWebServer
===============
Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.
* 使用**线程池 + epoll(ET和LT均实现) + 模拟Proactor模式**并发模型
* 使用**状态机**解析HTTP请求报文,支持解析**GET和POST**请求
* 通过访问服务器数据库实现web端用户**注册、登录**功能,可以请求服务器**图片和视频文件**
* 实现**同步/异步日志系统**,记录服务器运行状态
* 经Webbench压力测试可以实现**上万的并发连接**数据交换
模块概述
----------
> * C/C++
> * B/S模型
> * [线程同步机制包装类](https://github.com/qinguoyi/TinyWebServer/tree/master/lock)
> * [http连接请求处理类](https://github.com/qinguoyi/TinyWebServer/tree/master/http)
> * [半同步/半反应堆线程池](https://github.com/qinguoyi/TinyWebServer/tree/master/threadpool)
> * [定时器处理非活动连接](https://github.com/qinguoyi/TinyWebServer/tree/master/timer)
> * [同步/异步日志系统 ](https://github.com/qinguoyi/TinyWebServer/tree/master/log)
> * [数据库连接池](https://github.com/qinguoyi/TinyWebServer/tree/master/CGImysql)
> * [CGI及同步线程注册和登录校验](https://github.com/qinguoyi/TinyWebServer/tree/master/CGImysql)
> * [简易服务器压力测试](https://github.com/qinguoyi/TinyWebServer/tree/master/test_presure)
Update
----------
- [x] 解决请求服务器上大文件的Bug
- [x] 增加请求视频文件的页面
- [x] 解决数据库同步校验内存泄漏
- [x] 实现两种CGI数据库访问逻辑
- [x] 实现ET非阻塞和LT阻塞,并完成压力测试
Demo
----------
> * 注册演示
> * 登录演示
> * 请求图片文件演示(6M)
> * 请求视频文件演示(39M)
压力测试
-------------
Webbench对服务器进行压力测试,在ET非阻塞和LT阻塞模式下均可实现上万的并发连接.
> * ET非阻塞
> * LT阻塞
> * 并发连接总数:10500
> * 访问服务器时间:5s
> * 所有访问均成功
**注意:** 使用本项目的webbench进行压测时,若报错显示webbench命令找不到,将可执行文件webbench删除后,重新编译即可。
框架
-------------
web端界面
-------------
> * 判断是否注册
> * 注册
> * 注册失败提示
> * 登录
> * 登录失败提示


基础测试
------------
* 服务器测试环境
* Ubuntu版本16.04
* MySQL版本5.7.29
* 浏览器测试环境
* Windows、Linux均可
* Chrome
* FireFox
* 其他浏览器暂无测试
* 测试前确认已安装MySQL数据库
```C++
//建立yourdb库
create database yourdb set utf8;
//创建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.c中的数据库初始化信息
```C++
//root root为服务器数据库的登录名和密码
connection_pool *connPool=connection_pool::GetInstance("localhost","root","root","yourdb",3306,5);
```
* 修改http_conn.cpp中的root路径
```C++
const char* doc_root="/home/qgy/TinyWebServer/root";
```
* 生成server
```C++
make server
```
* 启动server
```C++
./server port
```
* 浏览器端
```C++
ip:port
```
个性化测试
------
* 选择任一**校验方式**,代码中使用同步校验,可以修改为CGI.
- [x] 同步线程数据库校验
* 关闭main.c中CGISQLPOOL,打开SYNSQL
```C++
23 #define SYNSQL //同步数据库校验
24 //#define CGISQLPOOL //CGI数据库校验
```
* 关闭http_conn.cpp中两种CGI,打开SYNSQL
```C++
7 //同步校验
8 #define SYNSQL
10 //CGI多进程使用链接池
11 //#define CGISQLPOOL
13 //CGI多进程不用连接池
14 //#define CGISQL
```
- [ ] CGI多进程数据库校验,不使用连接池
* 关闭main.c中SYNSQL和CGISQLPOOL
```C++
23 //#define SYNSQL //同步数据库校验
24 //#define CGISQLPOOL //CGI数据库校验
```
* 关闭http_conn.cpp中SYNSQL和CGISQLPOOL,打开CGISQL
```C++
7 //同步校验
8 //#define SYNSQL
10 //CGI多进程使用链接池
11 //#define CGISQLPOOL
13 //CGI多进程不用连接池
14 #define CGISQL
```
* 关闭sign.cpp中的CGISQLPOOL,打开CGISQL
```C++
12 #define CGISQL //不使用连接池
13 //#define CGISQLPOOL //使用连接池
```
* 修改sign.cpp中的数据库初始化信息
```C++
//root root为服务器数据库的登录名和密码
connection_pool *connPool=connection_pool::GetInstance("localhost","root","root","yourdb",3306,5);
```
* 生成CGISQL.cgi
```C++
make CGISQL.cgi
```
- [ ] CGI多进程数据库校验,使用连接池
* 关闭main.c中SYNSQL,打开CGISQLPOOL
```C++
23 //#define SYNSQL //同步数据库校验
24 #define CGISQLPOOL //CGI数据库校验
```
* 关闭http_conn.cpp中SYNSQL和CGISQL,打开CGISQLPOOL
```C++
7 //同步校验
8 //#define SYNSQL
10 //CGI多进程使用链接池
11 #define CGISQLPOOL
13 //CGI多进程不用连接池
14 //#define CGISQL
```
* 关闭sign.cpp中的CGISQL,打开CGISQLPOOL
```C++
12 //#define CGISQL //不使用连接池
13 #define CGISQLPOOL //使用连接池
```
* 生成CGISQL.cgi
```C++
make CGISQL.cgi
```
* 选择任一**I/O复用方式**,代码中使用LT阻塞,可以修改为ET非阻塞.
- [x] LT阻塞
* 关闭main.c中ET,打开LT
```C++
28 //#define ET //边缘触发非阻塞
29 #define LT //水平触发阻塞
```
* 关闭http_conn.cpp中ET,打开LT
```C++
16 //#define ET //边缘触发非阻塞
17 #define LT //水平触发阻塞
```
- [ ] ET非阻塞
* 关闭main.c中LT,打开ET
```C++
28 #define ET //边缘触发非阻塞
29 //#define LT //水平触发阻塞
```
* 关闭http_conn.cpp中LT,打开ET
```C++
16 #define ET //边缘触发非阻塞
17 //#define LT //水平触发阻塞
```
* 选择任一**日志方式**,代码中使用同步日志,可以修改为异步写入.
- [x] 同步写入日志
* 关闭main.c中ASYNLOG,打开同步写入SYNLOG
```C++
25 #define SYNLOG //同步写日志
26 //#define ASYNLOG /异步写日志
```
- [ ] 异步写入日志
* 关闭main.c中SYNLOG,打开异步写入ASYNLOG
```C++
25 //#define SYNLOG //同步写日志
26 #define ASYNLOG /异步写日志
```
* 选择数据库访问、I/O复用方式或日志写入方式后,按照前述生成server,启动server,即可进行测试.
更多资料
------------
请关注公众号 **“两猿社”**.
> * **带你丰富互联网相关项目经验,轻松应对校招!!!**
> * **项目模块详细讲解,在公众号内持续更新!!!**
致谢
------------
Linux高性能服务器编程,游双著.