Skip to content

一个使用C++20实现的轻量级的、高性能的HttpServer。

License

Notifications You must be signed in to change notification settings

Liccsu/TinyWebServer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TinyWebServer

简介

这是一个轻量级的、高性能的静态Web Server,使用C++ 20标准开发,使用IO多路复用和线程池实现了基于“事件分发”的多线程高并发的Reactor模式。支持HTTP/1.0HTTP/1.1协议,支持GETPOST请求,具有高并发和高吞吐量,使用WebBench进行c10k压力测试QPS(每秒处理请求数)达到1.8w,测试环境为笔记本,CPU:AMD Ryzen 5 3550H

测试

以下是程序主要结构:

程序结构

另外还实现了高性能的异步日志库:

日志库结构

为了简化图例,图中只使用了两块Buffer,而实际上程序使用了四块Buffer,目的是为了防止前端某个时候写入太快,一下子就用完了前端的那块Buffer,而后端的那块Buffer还没空出来,导致前端没有空闲的Buffer可用而需要新分配缓冲区带来额外的开销,所以程序中实际上预分配了四块Buffer,前端和后端各有两块,多出来的一块作为预备缓冲区,虽然这还是不能彻底解决问题,但是也极大程度上的减少了前端等待空闲Buffer的时间(实际应用中几乎不会出现四块缓冲区都用完的情况)。

程序还使用小根堆数据结构实现了高性能的时间堆用于管理连接时长,当某个连接长时间不活跃时即断开该连接,防止“僵尸”连接占用资源。

作为扩展,程序中还实现了基于MariaDB的数据库连接池,并使用RAII机制来管理连接。此数据库连接池不仅支持动态扩展和收缩,还能定期进行连接健康度监测,对不可用连接尝试重连,如果重连失败则关闭该连接并建立新连接。

程序使用YAML进行参数配置,降低硬编码。

目录结构:

.
|____LICENSE
|____app    // 程序源码目录
| |____server
| | |____WebServer.cpp
| | |____Epoller.hpp
| | |____WebServer.hpp
| | |____Epoller.cpp
| |____config
| | |____Config.cpp
| | |____Config.hpp
| |____timer
| | |____TimerHeap.cpp
| | |____TimerHeap.hpp
| |____http
| | |____HttpRequest.hpp
| | |____HttpResponse.cpp
| | |____HttpResponse.hpp
| | |____HttpConnection.cpp
| | |____HttpRequest.cpp
| | |____HttpConnection.hpp
| |____pool
| | |____SqlConnPool.cpp
| | |____ThreadPool.hpp
| | |____BlockingQueue.hpp
| | |____SqlConnPool.hpp
| |____logger
| | |____AsyncLogging.cpp
| | |____LogFile.cpp
| | |____LogStream.hpp
| | |____Logger.hpp
| | |____Fmt.hpp
| | |____LogFile.hpp
| | |____AsyncLogging.hpp
| | |____Logger.cpp
| |____buffer
| | |____Buffer.hpp
| | |____Buffer.cpp
| | |____FixedBuffer.hpp
|____main.cpp
|____dist    // 静态网站资源目录
|____CMakeLists.txt
|____assets    // README.md 附件目录
|____README.md

更多细节详见我的博文使用现代化C++编写WebServer项目总结

构建并使用

本项目仅支持Linux平台,理论上支持各大Linunx发行版,并在Debian12_x64Ubuntu24.02_x64ArchLinux_x64上测试通过,理论上也支持ARM架构的Linux发行版(尚未测试)。

Ubuntu为例:

1.更新软件包列表:

sudo apt update

2.安装所需依赖:

sudo apt install libmariadb-dev libmariadb-dev-compat mariadb-server libmariadb3 build-essential cmake

3.启动MariaDB服务并设置开机自启动:

sudo systemctl enable --now mariadb

4.克隆本仓库:

git clone --depth=1 --single-branch https://github.com/Liccsu/TinyWebServer.git

5.使用CMake进行构建:

# 先 cd 进入本项目目录
cd TinyWebServer
# 创建用于构建输出的目录
mkdir -p build
# 配置 CMake 项目
cmake -B build
# 构建
cmake --build build --target all -j 6
# 如果需要清理构建
cmake --build build --target clean -j 6

6.运行:

./build/TinyWebServer

7.测试:

使用WebBench进行c10k压力测试:

webbench -c 10000 -t 30 http://127.0.0.1:6666

配置

首次运行程序后,在工作目录下会生成config目录,编辑其中的config.yml来配置参数。

config.yml内容如下(注意配置项缺一不可!!!):

server:
    # 监听端口
    port: 6666
    # 连接超时时间,单位毫秒
    timeout: 60000

mysql:
    # MySQL HOST
    host: 127.0.0.1
    # MySQL PORT
    port: 3306
    # MySQL 用户名
    user: root
    # MySQL 密码
    password: 123456
    # MySQL 数据库名
    db: tiny_web_server_db
    # 数据库连接池初始大小
    pool_size: 12
    # 数据库连接池最低大小
    pool_min_size: 6
    # 数据库连接池最高大小
    pool_max_size: 24

log:
    # 日志文件输出目录
    directory: ./log
    # 日志输出级别 1:debug 2:info 3:warning 4:error 5:none
    level: 2
    # 单个日志文件大小限制,单位 MB
    size: 64
    # 日志文件名 (base name)
    basename: tiny_web_server
    # 是否输出彩色,当选择输出到文件时建议关闭
    colorful: false
    # 是否输出到文件 true:输出到文件 false:输出到终端
    output_to_file: true

site:
    # 静态网站目录
    path: ./dist

致谢

JehanRio/TinyWebServer

chenshuo/muduo

About

一个使用C++20实现的轻量级的、高性能的HttpServer。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published