TinyWebServer
===============
Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.
* 使用 **线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现)** 的并发模型
* 使用**状态机**解析HTTP请求报文,支持解析**GET和POST**请求
* 访问服务器数据库实现web端用户**注册、登录**功能,可以请求服务器**图片和视频文件**
* 实现**同步/异步日志系统**,记录服务器运行状态
* 经Webbench压力测试可以实现**上万的并发连接**数据交换
写在前面
----
* 本项目开发维护过程中,很多童鞋曾发红包支持,我都一一谢绝。我现在不会,将来也不会将本项目包装成任何课程售卖,更不会开通任何支持通道。
* 目前网络上有人或对本项目,或对游双大佬的项目包装成课程售卖。请各位童鞋擦亮眼,辨识各大学习/求职网站的C++服务器项目,不要盲目付费。
* 有面试官大佬通过项目信息在公司内找到我,发现很多童鞋简历上都用了这个项目。但,在面试过程中发现`很多童鞋通过本项目入门了,但是对于一些东西还是属于知其然不知其所以然的状态,需要加强下基础知识的学习`,推荐认真阅读下
* 《unix环境高级编程》
* 《unix网络编程》
* 感谢各位大佬,各位朋友,各位童鞋的认可和支持。如果本项目能带你入门,将是我莫大的荣幸。
项目速递
----------
最近新写了一个Go语言的练手项目[osproxy](https://github.com/qinguoyi/osproxy)和[osproxy-grpc](https://github.com/qinguoyi/osproxy-grpc),代码已完全开源。
* **最简单的应用就是,你可以拿他部署自己的图床,或者一个简单的云盘,也可以作为文件存储微服务**。
* 如果你正在学习Go语言,对S3对象存储感兴趣,欢迎star,欢迎交流。
目录
-----
| [概述](#概述) | [框架](#框架) | [Demo演示](#Demo演示) | [压力测试](#压力测试) |[更新日志](#更新日志) |[源码下载](#源码下载) | [快速运行](#快速运行) | [个性化运行](#个性化运行) | [庖丁解牛](#庖丁解牛) | [CPP11实现](#CPP11实现) |[致谢](#致谢) |
|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:|
概述
----------
> * 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)
> * [同步线程注册和登录校验](https://github.com/qinguoyi/TinyWebServer/tree/master/CGImysql)
> * [简易服务器压力测试](https://github.com/qinguoyi/TinyWebServer/tree/master/test_presure)
框架
-------------
<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="https://github.com/qinguoyi/TinyWebServer/blob/master/root/login.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>
> * 并发连接总数:10500
> * 访问服务器时间:5s
> * 所有访问均成功
**注意:** 使用本项目的webbench进行压测时,若报错显示webbench命令找不到,将可执行文件webbench删除后,重新编译即可。
更新日志
-------
- [x] 解决请求服务器上大文件的Bug
- [x] 增加请求视频文件的页面
- [x] 解决数据库同步校验内存泄漏
- [x] 实现非阻塞模式下的ET和LT触发,并完成压力测试
- [x] 完善`lock.h`中的封装类,统一使用该同步机制
- [x] 改进代码结构,更新局部变量懒汉单例模式
- [x] 优化数据库连接池信号量与代码结构
- [x] 使用RAII机制优化数据库连接的获取与释放
- [x] 优化代码结构,封装工具类以减少全局变量
- [x] 编译一次即可,命令行进行个性化测试更加友好
- [x] main函数封装重构
- [x] 新增命令行日志开关,关闭日志后更新压力测试结果
- [x] 改进编译方式,只配置一次SQL信息即可
- [x] 新增Reactor模式,并完成压力测试
源码下载
-------
目前有两个版本,版本间的代码结构有较大改动,文档和代码运行方法也不一致。重构版本更简洁,原始版本(raw_version)更大保留游双代码的原汁原味,从原始版本更容易入手.
如果遇到github代码下载失败,或访问太慢,可以从以下链接下载,与Github最新提交同步.
* 重构版本下载地址 : [BaiduYun](https://pan.baidu.com/s/1PozKji8Oop-1BYcfixZR0g)
* 提取码 : vsqq
* 原始版本(raw_version)下载地址 : [BaiduYun](https://pan.baidu.com/s/1asMNDW-zog92DZY1Oa4kaQ)
* 提取码 : 9wye
* 原始版本运行请参考[原始文档](https://github.com/qinguoyi/TinyWebServer/tree/raw_version)
快速运行
------------
* 服务器测试环境
* 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++
ip: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,选择日志写入方式,默
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器. 使用 线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现) 的并发模型 使用状态机解析HTTP请求报文,支持解析GET和POST请求 访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件 实现同步/异步日志系统,记录服务器运行状态 经Webbench压力测试可以实现上万的并发连接数据交换
资源推荐
资源详情
资源评论
收起资源包目录
TinyWebServer.zip (61个子文件)
makefile 311B
threadpool
threadpool.h 4KB
README.md 309B
CGImysql
sql_connection_pool.cpp 2KB
sql_connection_pool.h 1KB
README.md 298B
webserver.h 2KB
timer
lst_timer.cpp 4KB
README.md 444B
lst_timer.h 2KB
test_pressure
webbench-1.5
COPYRIGHT 16B
ChangeLog 16B
Makefile 1KB
debian
changelog 2KB
rules 1KB
copyright 242B
control 460B
dirs 7B
tags 2KB
webbench.c 11KB
webbench.1 2KB
webbench.o 60KB
webbench 41KB
socket.c 1KB
README.md 966B
main.cpp 806B
config.h 650B
http
http_conn.cpp 18KB
http_conn.h 3KB
README.md 418B
root
test1.jpg 77KB
register.html 724B
picture.gif 5.77MB
loginnew.gif 339KB
welcome.html 723B
fans.html 392B
xxx.jpg 5.73MB
video.html 381B
xxx.mp4 37.83MB
login.gif 251KB
frame.jpg 132KB
favicon.ico 4KB
registernew.gif 268KB
picture.html 360B
registerError.html 786B
logError.html 821B
log.html 725B
judge.html 586B
video.gif 5.7MB
README.md 210B
register.gif 211KB
config.cpp 2KB
README.md 12KB
log
block_queue.h 4KB
log.h 2KB
log.cpp 4KB
README.md 345B
lock
locker.h 2KB
README.md 177B
build.sh 24B
webserver.cpp 11KB
共 61 条
- 1
资源评论
小嗷犬
- 粉丝: 2w+
- 资源: 1334
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功