Skip to content
 
 

Repository files navigation

TinyWebServer(基于 qinguoyi/TinyWebServer 二次开发)

Linux下C++轻量级Web服务器,在保留原项目 线程池 + Epoll (ET) + Reactor/Proactor 高并发架构的基础上,新增文件上传功能优化全站前端界面,并修复了静态资源 MIME 类型等实用性细节.

原项目地址:https://github.com/qinguoyi/TinyWebServer


新增功能 / 改进

  • 文件上传
    支持 multipart/form-data 格式的文件上传,自动解析 boundary,提取文件名与内容,保存至 ./upload/ 目录,并返回用户友好的成功页面。
  • 全站界面美化
    重新设计所有 HTML 页面(登录、注册、主面板、上传、成功提示等),使用统一的现代卡片式布局,配色简洁,交互流畅。
  • MIME 类型支持
    增加了基于文件扩展名的 MIME 类型映射(get_mime_type),为静态资源响应添加正确的 Content-Type 头,解决了部分浏览器直接显示 HTML 源码或乱码的问题。
  • 上传路径安全
    上传文件名自动去除路径前缀,防止目录穿越攻击。
  • 路由扩展
    新增 /8(上传页面)和 /upload(上传接口)路由,与原有登录/注册/图片视频等功能无缝集成。

原项目描述

  • 使用 线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现) 的并发模型
  • 使用状态机解析HTTP请求报文,支持解析GET和POST请求
  • 访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件
  • 实现同步/异步日志系统,记录服务器运行状态
  • 经Webbench压力测试可以实现上万的并发连接数据交换

目录

概述 框架 界面展示 压力测试 快速运行 个性化运行 致谢

概述

框架

界面展示

  • 首界面
  • 注册界面
  • 登录界面
  • 欢迎界面
  • 图片展示界面
  • 视频播放界面
  • 文件上传界面
  • 文件上传成功界面

压力测试

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

  • Proactor,LT + LT,93251 QPS
  • Proactor,LT + ET,97459 QPS
  • Proactor,ET + LT,80498 QPS
  • Proactor,ET + ET,92167 QPS
  • Reactor,LT + ET,69175 QPS
  • 并发连接总数:10500
  • 访问服务器时间:5s
  • 所有访问均成功

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

快速运行

  • 服务器测试环境

    • 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反应堆模型

致谢

本项目基于 qinguoyi/TinyWebServer 进行二次开发,只用于自主学习,遵守原项目许可证。 十分感谢原作者的开源,如果你觉得有帮助,欢迎给原项目点个 Star⭐️。

About

🔥 Linux下C++轻量级WebServer服务器

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages