linux轻量级web服务,GitHub - qinguoyi/TinyWebServer: Linux下C++轻量级Web服务器

TinyWebServer

Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.

使用 线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现) 的并发模型

使用状态机解析HTTP请求报文,支持解析GET和POST请求

访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件

实现同步/异步日志系统,记录服务器运行状态

经Webbench压力测试可以实现上万的并发连接数据交换

目录

概述

框架

10eca0173cea36dcbf540296cb97cacb.png

Demo演示

注册演示

06dd3d701805c653460b7b415baefd94.gif

登录演示

ad8750a03b3e496db29bd7ddf829d186.gif

请求图片文件演示(6M)

e5fa6411eac2730658bdcc94e79c5929.gif

请求视频文件演示(39M)

5e885021b1af49c625d6f2e8eecf402f.gif

压力测试

在关闭日志后,使用Webbench对服务器进行压力测试,对listenfd和connfd分别采用ET和LT模式,均可实现上万的并发连接,下面列出的是两者组合后的测试结果.

Proactor,LT + LT,93251 QPS

1876ad13ef968fc1c3f09191d1a70b77.png

Proactor,LT + ET,97459 QPS

5335c7cf968a2755309df2e7bd2542a5.png

Proactor,ET + LT,80498 QPS

cdbfe15f921c62463baf53597574797a.png

Proactor,ET + ET,92167 QPS

7ebea9147ec70f6593746c6094592e4d.png

Reactor,LT + ET,69175 QPS

bac42e519a486945728813b0e9131b31.png

并发连接总数:10500

访问服务器时间:5s

所有访问均成功

注意: 使用本项目的webbench进行压测时,若报错显示webbench命令找不到,将可执行文件webbench删除后,重新编译即可。

更新日志

解决请求服务器上大文件的Bug

增加请求视频文件的页面

解决数据库同步校验内存泄漏

实现非阻塞模式下的ET和LT触发,并完成压力测试

完善lock.h中的封装类,统一使用该同步机制

改进代码结构,更新局部变量懒汉单例模式

优化数据库连接池信号量与代码结构

使用RAII机制优化数据库连接的获取与释放

优化代码结构,封装工具类以减少全局变量

编译一次即可,命令行进行个性化测试更加友好

main函数封装重构

新增命令行日志开关,关闭日志后更新压力测试结果

改进编译方式,只配置一次SQL信息即可

新增Reactor模式,并完成压力测试

源码下载

目前有两个版本,版本间的代码结构有较大改动,文档和代码运行方法也不一致。重构版本更简洁,原始版本(raw_version)更大保留游双代码的原汁原味,从原始版本更容易入手.

如果遇到github代码下载失败,或访问太慢,可以从以下链接下载,与Github最新提交同步.

重构版本下载地址 : BaiduYun

提取码 : vsqq

原始版本(raw_version)下载地址 : BaiduYun

提取码 : 9wye

原始版本运行请参考原始文档

快速运行

服务器测试环境

Ubuntu版本16.04

MySQL版本5.7.29

浏览器测试环境

Windows、Linux均可

Chrome

FireFox

其他浏览器暂无测试

测试前确认已安装MySQL数据库

// 建立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中的数据库初始化信息

//数据库登录名,密码,库名

string user = "root";

string passwd = "root";

string databasename = "yourdb";

build

sh ./build.sh

启动server

./server

浏览器端

ip:9006

个性化运行

./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模型

测试示例命令与含义

./server -p 9007 -l 1 -m 0 -o 1 -s 10 -t 10 -c 1 -a 1

端口9007

异步写入日志

使用LT + LT组合

使用优雅关闭连接

数据库连接池内有10条连接

线程池内有10条线程

关闭日志

Reactor反应堆模型

庖丁解牛

近期版本迭代较快,以下内容多以旧版本(raw_version)代码为蓝本进行详解.

CPP11实现

更简洁,更优雅的CPP11实现:Webserver

致谢

Linux高性能服务器编程,游双著.

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值