-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathREADME.md~
182 lines (131 loc) · 5.1 KB
/
README.md~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
TinyWebServer
===============
Linux下基于C++的轻量级Web服务器注释、修改版本.
原项目来自:https://github.com/qinguoyi/TinyWebServer
** 有什么特点? **
* 使用 **线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现)** 的并发模型
* 使用**状态机**解析HTTP请求报文,支持解析**GET和POST**请求
* 访问服务器数据库实现web端用户**注册、登录**功能,可以请求播放服务器**图片和视频文件**
* 实现**同步/异步日志系统**,记录服务器运行状态
* 经Webbench压力测试可以实现**上万的并发连接**数据交换
目录
-----
| [框架](#框架) | [Demo演示](#Demo演示) | [压力测试](#压力测试) |[源码下载](#源码下载) | [快速运行](#快速运行) | [个性化运行](#个性化运行) |[致谢](#致谢) |
|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|
框架
-------------
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0j1atq5hj30g60lm0w4.jpg" height="765"/> </div>
Demo演示
----------
> * 注册演示
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0iz0dkleg30m80bxjyj.gif" height="429"/> </div>
> * 登录演示
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0izcc0r1g30m80bxn6a.gif" height="429"/> </div>
> * 请求图片文件演示(6M)
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0juxrnlfg30go07x4qr.gif" height="429"/> </div>
> * 请求视频文件演示(39M)
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1ge0jtxie8ng30go07xb2b.gif" height="429"/> </div>
压力测试
-------------
在**关闭日志(防止日志信息过大)**后,使用Webbench对服务器进行压力测试,对listenfd和connfd分别采用ET和LT模式,均可实现上万的并发连接,下面列出的是两者组合后的测试结果.
> * Proactor,LT + LT,93251 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjqu2hptkj30gz07474n.jpg" height="201"/> </div>
> * Proactor,LT + ET,97459 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjr1xppdgj30h206zdg6.jpg" height="201"/> </div>
> * Proactor,ET + LT,80498 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjr24vmjtj30gz0720t3.jpg" height="201"/> </div>
> * Proactor,ET + ET,92167 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjrflrebdj30gz06z0t3.jpg" height="201"/> </div>
> * Reactor,LT + ET,69175 QPS
<div align=center><img src="http://ww1.sinaimg.cn/large/005TJ2c7ly1gfjr1humcbj30h207474n.jpg" height="201"/> </div>
> * 并发连接总数:10000
> * 访问服务器时间:5s
> * 所有访问均成功
**注意:** 使用本项目的webbench进行压测时,若报错显示webbench命令找不到,将可执行文件webbench删除后,重新编译即可。
快速运行
------------
* 服务器测试环境
* 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 = "root";
string passwd = "root";
string databasename = "yourdb";
```
* build
```C++
sh ./build.sh
```
* 启动server
```C++
./server
```
* 浏览器端
```C++
127.0.0.1:9006
```
个性化运行
------
```C++
./server [-p port] [-l LOGWrite] [-m TRIGMode] [-o OPT_LINGER] [-s sql_num] [-t thread_num] [-c close_log] [-a actor_model]
```
温馨提示:以上参数不是非必须,不用全部使用,根据个人情况搭配选用即可.
* -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模型
测试示例命令与含义
```C++
./server -p 9007 -l 1 -m 0 -o 1 -s 10 -t 10 -c 1 -a 1
```
- [x] 端口9007
- [x] 异步写入日志
- [x] 使用LT + LT组合
- [x] 使用优雅关闭连接
- [x] 数据库连接池内有10条连接
- [x] 线程池内有10条线程
- [x] 关闭日志
- [x] Reactor反应堆模型
致谢
------------
Linux高性能服务器编程,游双著.
源码来自:https://github.com/qinguoyi/TinyWebServer