Zhenghao-Liu / MiniWebServer

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

MiniWebServer

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

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

框架

frame

Code目录树

.
|-- build.sh
|-- CGImysql
|   |-- README.md
|   |-- sql_connection_pool.cpp
|   `-- sql_connection_pool.h
|-- config.cpp
|-- config.h
|-- http
|   |-- http_conn.cpp
|   |-- http_conn.h
|   `-- README.md
|-- lock
|   |-- locker.h
|   `-- README.md
|-- log
|   |-- block_queue.h
|   |-- log.cpp
|   |-- log.h
|   `-- README.md
|-- main.cpp
|-- makefile
|-- root
|   |-- fans.html
|   |-- favicon.ico
|   |-- judge.html
|   |-- logError.html
|   |-- log.html
|   |-- picture.html
|   |-- README.md
|   |-- registerError.html
|   |-- register.html
|   |-- test1.jpg
|   |-- video.html
|   |-- welcome.html
|   |-- xxx.jpg
|   `-- xxx.mp4
|-- server
|-- show_errno
|   |-- README.md
|   `-- show_errno.h
|-- test_presure
|   |-- README.md
|   `-- webbench-1.5
|       |-- ChangeLog
|       |-- COPYRIGHT
|       |-- debian
|       |   |-- changelog
|       |   |-- control
|       |   |-- copyright
|       |   |-- dirs
|       |   `-- rules
|       |-- Makefile
|       |-- socket.c
|       |-- tags
|       |-- webbench
|       |-- webbench.1
|       |-- webbench.c
|       `-- webbench.o
|-- threadpool
|   |-- half-sync-reactive.bmp
|   |-- README.md
|   `-- threadpool.h
|-- timer
|   |-- lst_timer.cpp
|   |-- lst_timer.h
|   `-- README.md
|-- webserver.cpp
`-- webserver.h

运行

  • 系统环境

    • Centos 7
    • MYSQL 8.0.22
    • 以上是作者运行的环境,可自行调整
  • 浏览器环境

    • Chrome
  • 测试前确保已经安装好MYSQL

// 建立yourdb库
// 这里的yourdb是自定义名字,是后面main中的databasename
CREATE DATABASE yourdb;
USE yourdb;

// 创建user表,表名不更改
CREATE TABLE user(
    username char(50) NULL,
    passwd char(50) NULL
)ENGINE=InnoDB;

// 添加数据,这里作为测试表是否可用,其实也是等于创建了一个用户
INSERT INTO user(username, passwd) VALUES('name', 'passwd');
  • 修改main.cpp中的数据库初始化信息
//MYSQL登录名,密码,DATABASE数据库名
string user = "root";
string passwd = "root";
string databasename = "yourdb";
  • 编译
# 方式1
$ sh ./build.sh
# 方式2
$ make server
  • 运行主程序
$ ./server
  • 也可个性化配置参数运行主程序
$ ./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模型

浏览器运行结果查看

  1. 方式1:以个人主机ip和端口的方式
主机ip:端口
http://175.24.234.48:9006/
  1. 方式2:在本机上运行则可直接输入端口
端口号
localhost:9006

压力测试

一些遇到的问题

学习自

  1. 《Linux高性能服务器编程》游双
  2. TinyWebServer 已经提交Pull request请求merge
  3. 文章

About


Languages

Language:C++ 77.3%Language:C 12.5%Language:HTML 5.3%Language:Makefile 2.5%Language:Roff 2.3%Language:Shell 0.0%