Skip to content

Chieko3020/HttpWebServer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

HttpWebServer

  • Linux轻量级HTTP服务器,实现HTTP GET/POST请求解析与响应
  • 使用Reactor模型、非阻塞IO、epoll多路复用、线程池相结合的并发模型
  • 使用vector封装自动增长缓冲区,缓解IO系统调用,提高数据读写性能
  • 使用queue封装定时事件,实现最小堆定时器,关闭超时非活动连接
  • 使用MySQL及数据库连接池,实现web端用户注册与登录
  • 使用deque封装阻塞队列,实现同步/异步日志系统,记录服务器运行状态
  • 参考了@qinguoyi 和 @JehanRio . Thanks for help. ❤
  • 压力测试记录/test 5000 clients 30 seconds.
  • Windows Subsystem for Linux - Ubuntu 24.04 LTS & Visual Studio Code

一个基于C++11的高性能Web服务器学习项目,采用Reactor模式实现,支持高并发连接处理,主要用于理解Web服务器的实现原理

项目特性

  • 高并发处理: 基于epoll的I/O多路复用,支持ET/LT模式
  • 线程池: 使用C++11线程池处理HTTP请求,提高并发性能
  • 连接池: MySQL数据库连接池,支持数据库操作
  • 定时器: 基于小根堆的定时器,自动清理超时连接
  • 日志系统: 异步日志系统,支持多级别日志输出
  • HTTP解析: 完整的HTTP请求/响应解析和生成
  • 缓冲区: 自定义缓冲区类,支持高效的数据读写
  • 优雅关闭: 支持优雅关闭服务器

技术架构

核心模块

  1. Web服务器 (Web_Server)

    • 主服务器类,负责初始化和启动服务器
    • 支持端口配置、触发模式选择、超时设置等
  2. HTTP连接处理 (Http_Conn)

    • 处理客户端HTTP连接
    • 支持请求解析和响应生成
    • 实现Keep-Alive连接复用
  3. I/O多路复用 (Epoller)

    • 基于epoll的事件驱动模型
    • 支持ET/LT两种触发模式
    • 高效处理大量并发连接
  4. 线程池 (Thread_Pool)

    • 基于C++11的线程池实现
    • 任务队列管理,支持动态任务分配
    • 线程安全的任务执行
  5. 数据库连接池 (Sql_Conn_Pool)

    • MySQL连接池管理
    • RAII模式自动资源管理
    • 支持连接复用和自动回收
  6. 定时器 (Heap_Timer)

    • 基于小根堆的定时器实现
    • 支持定时任务和超时检测
    • 自动清理过期连接
  7. 日志系统 (Log)

    • 异步日志写入
    • 多级别日志支持 (DEBUG/INFO/WARN/ERROR)
    • 线程安全的日志输出
  8. 缓冲区 (Buffer)

    • 自定义缓冲区实现
    • 支持高效的数据读写操作
    • 自动内存管理

架构图

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   客户端请求     │───▶│   Web_Server    │───▶│   Epoller       │
└─────────────────┘    └─────────────────┘    └─────────────────┘
                                │                        │
                                ▼                        ▼
                       ┌─────────────────┐    ┌─────────────────┐
                       │   Thread_Pool   │    │   Http_Conn     │
                       └─────────────────┘    └─────────────────┘
                                │                        │
                                ▼                        ▼
                       ┌─────────────────┐    ┌─────────────────┐
                       │ Sql_Conn_Pool   │    │   Heap_Timer    │
                       └─────────────────┘    └─────────────────┘
                                │                        │
                                ▼                        ▼
                       ┌─────────────────┐    ┌─────────────────┐
                       │     MySQL       │    │      Log        │
                       └─────────────────┘    └─────────────────┘

环境要求

  • 操作系统: Linux (推荐Ubuntu 18.04+)
  • 编译器: GCC 7.0+ (支持C++14)
  • 数据库: MySQL 5.7+
  • 依赖库:
    • pthread (线程库)
    • mysqlclient (MySQL客户端库)

编译安装

1. 安装依赖

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install libmysqlclient-dev

# CentOS/RHEL
sudo yum install gcc-c++ make
sudo yum install mysql-devel

2. 配置MySQL数据库

方法一:使用提供的初始化脚本(推荐)

# 登录MySQL
mysql -u root -p

# 创建数据库
CREATE DATABASE httpwebserver;

# 使用数据库
USE httpwebserver;

# 执行初始化脚本
SOURCE /path/to/HttpWebServer/init.sql;

方法二:手动创建

-- 创建数据库
CREATE DATABASE httpwebserver;

-- 创建用户 (可选)
CREATE USER 'suzune'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON httpwebserver.* TO 'suzune'@'localhost';
FLUSH PRIVILEGES;

-- 使用数据库
USE httpwebserver;

-- 创建用户表
CREATE TABLE `user` (
  `username` char(50) DEFAULT NULL,
  `password` char(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- 插入测试数据
INSERT INTO `user` VALUES ('Chieko3020','123456'),('suzune','123456'),('3226010143','123456');

3. 编译项目

# 克隆项目
git clone <https://github.com/Chieko3020/HttpWebServer>
cd HttpWebServer

# 编译
make

# 清理编译文件
make clean

配置说明

服务器配置

code/main.cpp 中可以修改服务器配置:

Web_Server server(
    3020, 3, 60000, false,             // 端口 ET模式 timeoutMs 优雅退出
    3306, "suzune", "123456", "httpwebserver", // MySQL配置
    12, 6, true, 1, 1024);             // 连接池数量 线程池数量 日志开关 日志等级 日志异步队列容量

参数说明

  • 端口: 服务器监听端口 (默认3020)
  • 触发模式: 1=LT, 3=ET (默认ET模式)
  • 超时时间: 连接超时时间,单位毫秒 (默认60000ms)
  • 优雅退出: 是否启用优雅关闭 (默认false)
  • MySQL配置: 数据库端口、用户名、密码、数据库名
  • 连接池数量: MySQL连接池大小 (默认12)
  • 线程池数量: 工作线程数量 (默认6)
  • 日志开关: 是否启用日志 (默认true)
  • 日志等级: 0=DEBUG, 1=INFO, 2=WARN, 3=ERROR (默认1)
  • 日志队列容量: 异步日志队列大小 (默认1024)

运行服务器

# 启动服务器
./server

数据库说明

数据库表结构

项目使用MySQL数据库存储用户信息,主要包含以下表:

user表

字段名 类型 说明
username char(50) 用户名
password char(50) 密码

预置测试数据

数据库初始化脚本 init.sql 包含以下测试用户:

  • 用户名: Chieko3020, 密码: 123456
  • 用户名: suzune, 密码: 123456
  • 用户名: 3226010143, 密码: 123456

数据库文件

  • init.sql: 数据库初始化脚本,包含表结构和测试数据

测试访问

启动服务器后,可以通过浏览器访问:

使用上述测试账号可以登录系统进行功能测试。

性能测试

项目包含webbench压力测试工具:

# 进入测试目录
cd webbench-1.5

# 编译测试工具
make

# 运行压力测试
./webbench -c 1000 -t 10 http://localhost:3020/

参数说明:

  • -c 1000: 1000个并发连接
  • -t 10: 测试持续10秒

项目结构

HttpWebServer/
├── code/                    # 源代码目录
│   ├── main.cpp            # 主程序入口
│   ├── server/             # 服务器核心模块
│   │   ├── webserver.h     # Web服务器类
│   │   ├── webserver.cpp
│   │   └── epoller.h       # epoll封装
│   ├── http/               # HTTP处理模块
│   │   ├── httpconn.h      # HTTP连接类
│   │   ├── httprequest.h   # HTTP请求解析
│   │   └── httpresponse.h  # HTTP响应生成
│   ├── pool/               # 池化模块
│   │   ├── threadpool.h    # 线程池
│   │   └── sqlconnpool.h   # 数据库连接池
│   ├── timer/              # 定时器模块
│   │   └── heaptimer.h     # 堆定时器
│   ├── log/                # 日志模块
│   │   ├── log.h           # 日志类
│   │   └── blockqueue.h    # 阻塞队列
│   └── buffer/             # 缓冲区模块
│       └── buffer.h        # 缓冲区类
├── resources/              # 静态资源目录
│   ├── index.html          # 主页
│   ├── login.html          # 登录页面
│   ├── register.html       # 注册页面
│   └── ...                 # 其他静态文件
├── log/                    # 日志文件目录
├── test/                   # 测试文件目录
├── webbench-1.5/          # 压力测试工具
├── init.sql               # 数据库初始化脚本
├── Makefile               # 编译配置
└── README.md              # 项目说明

About

A pool HttpWebServer on Linux

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published