Web服务器项目详解 - 00 项目概述
目录
- 00 项目概述
- 01 线程同步机制包装类
- 02 半同步/半反应堆线程池(上)
- 03 半同步/半反应堆线程池(下)
- 04 http连接处理(上)
- 05 http连接处理(中)
- 06 http连接处理(下)
- 07 定时器处理非活动连接(上)
- 08 定时器处理非活动连接(下)
- 09 日志系统(上)
- 10 日志系统(下)
- 11 数据连接池
- 12 注册和登录校验
- 13 服务器测试
- 14 项目遇到的问题及解决方案
- 15 项目涉及的常见面试题
功能
- Linux下C++轻量级Web服务器基于C/C++语言和B/S模型
- 实现web端的注册和登录,通过数据库连接池访问服务器
- 实现同步和异步日志系统,记录服务器运行状态的功能
- 通过Webbench对服务器进行测试,可以实现上万并发连接
- 每秒钟响应请求数:552852 pages/min
- 每秒钟传输数据量:1031990 bytes/sec
- 所有连接访问均成功

框架
- 项目框架主要分为I/O处理单元、逻辑处理单元和存储单元三个模块
- I/O处理单元和逻辑处理单元对应半同步/半反应堆线程池
- 逻辑处理单元和存储单元对应数据库连接池和日志系统
- 半同步/半反应堆线程池将web端和服务器端建立通信
- 实现http请求报文的处理与响应
- 定时器完成非活动连接的处理
- 数据库连接池避免频繁访问数据库,实现登录和校验功能
- 日志系统实现同步和异步两种方式记录服务器运行状态

工作流程
以一个请求到来具体的处理过程介绍项目工作流程,具体包括web端和服务器建立连接,访问服务器数据库完成登录和注册,并通过定时器完成非活动连接的处理,最后服务器运行状态通过日志系统进行记录。
- web端和服务器端建立连接
- 采用epoll的边缘触发模式同时监听多个文件描述符,采用同步I/O模拟proactor模式处理事件,主线程负责监听客户端是否发起请求
- 当web端发起http请求时,主线程接收请求报文,然后将任务插入请求队列,由工作线程通过竞争从请求队列中获取任务
- 通过http类中的主从状态机对请求报文进行分析,根据请求报文对客户端进行http响应,然后由主线程给客户端发送响应报文。
- 连接数据库
- 单例模式创建数据库连接池,避免频繁建立连接,用于后续web端登录和注册校验访问服务器数据库
- 实现web端的登录和注册
- web访问的欢迎界面为GET请求,登录和注册界面是POST请求。
- 欢迎界面有新用户(0)和已有账号(1)两个选项,若选择新用户,会跳转注册(3)界面,注册成功或选择已有账号,跳转登录(2)界面,注册或登录失败会提示失败,成功和失败为0,1
- 同步/异步日志系统,记录服务器运行状态
- 同步的方式下,工作线程直接写入日志文件
- 异步会另外创建一个写线程,工作线程将要写的内容push进请求队列,通过写线程写入文件
- 日志文件支持按日期分类,和超过最大行数自动创建新文件
- 非活动连接的处理
- 由于非活跃连接占用了连接资源,严重影响服务器的性能,通过实现一个服务器定时器,处理这种非活跃连接,释放连接资源。
- 利用alarm函数周期性地触发SIGALRM信号,该信号的信号处理函数利用管道通知主循环执行定时器链表上的定时任务.
web端测试
测试前确认已安装MySQL数据库
//建立yourdb库
create database yourdb set utf8; //创建users表
USE yourdb;
CREATE TABLE users(
username char(50) NULL,
passwd char(50) NULL
)ENGINE=InnoDB; //添加数据
INSERT INTO users(username, passwd) VALUES('name', 'passwd');
修改main.c中的数据库初始化信息
//root root为服务器数据库的登录名和密码
connection_pool *connPool=connection_pool::GetInstance("localhost","root","root","yourdb",3306,5);
修改http_conn.cpp中的数据库初始化信息
//root root为服务器数据库的登录名和密码
connection_pool *connPool=connection_pool::GetInstance("localhost","root","root","yourdb",3306,5);
修改http_conn.cpp中的root路径
const char* doc_root="/home/qgy/github/ini_tinywebserver/root";
CGI多进程注册/登录校验
打开http_conn.cpp中CGI,关闭同步线程
380 //同步线程登录校验
381 //#if 0
423 //#endif 425 //CGI多进程登录校验
426 #if 0
495 #endif
修改sign.cpp中的数据库初始化信息
//root root为服务器数据库的登录名和密码
connection_pool *connPool=connection_pool::GetInstance("localhost","root","root","yourdb",3306,5);
生成check.cgi
make check.cgi
将生成的check.cgi放到root文件夹
cp ./check.cgi ./root
同步线程注册/登录校验
关闭http_conn.cpp中CGI,打开同步线程
380 //同步线程登录校验
381 //#if 0
423 //#endif 425 //CGI多进程登录校验
426 #if 0
495 #endif
生成server
make server
启动server
./server port
浏览器端
ip:port
更多资料
- 关注公众号【两猿社】,进入公众号
- 带你丰富互联网相关项目经验,轻松应对校招!!!
- 项目模块详细讲解,在公众号内持续更新!!!

Web服务器项目详解 - 00 项目概述的更多相关文章
- Servlet学习之web服务器Tomcat 详解
Web服务器是什么 Web服务器是指驻留于因特网上某种类型计算机的程序.当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该文 ...
- 于网站主机,DNS,域名解析,Web服务器关系详解
/*本文将介绍网站主机,DNS,域名解析,Web服务器关系,转载请保留以下版权*/ /*启明星工作室 www.dotnetcms.org 提供会议室预定系统,请假系统,helpdesk,工作日志系统 ...
- Mac下Intellij IDea发布Web项目详解一
Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intellij IDea发布J ...
- Mac下Intellij IDea发布Java Web项目详解五 开始测试
测试前准备工作目录 Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intell ...
- JAVA Eclipse使用Maven构建web项目详解(SSM框架)
tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...
- tomcat通过tomcat 安装根目录下的conf-Catalina-localhost目录发布项目详解
tomcat通过conf-Catalina-localhost目录发布项目详解 Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目 ...
- eclipse里面构建maven项目详解(转载)
本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1 环境安装及分配 Maven是基于项目对象模 ...
- Redis 配置文件 redis.conf 项目详解
Redis.conf 配置文件详解 # [Redis](http://yijiebuyi.com/category/redis.html) 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, ...
- net core 中间件详解及项目实战
net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的H ...
随机推荐
- k8s CNI插件简单了解
Kubernetes网络模型本身对某些特定的网络功能有一定要求,但在实现方面也具有一定的灵活性.业界已经有不少不同的网络方案,来满足特定的环境和要求. CNI(container network in ...
- mysql 报错:Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences
目录 #事故现场 #解决方法 #事故现场 mysql执行update操作报错: sql如下: update psmp.Users set name='Jack' where name='Lily'; ...
- C# 二进制 十进制 十六进制 之间的转换
; Console.WriteLine(a.ToString("X")); //10进制转16进制 Console.WriteLine(Convert.ToString(a, )) ...
- node.remove()
node.remove()方法是在DOM 4规范中实现的,由于糟糕的浏览器支持,不建议使用.应该使用removeChild方法,但是该方法必须要清楚父元素,通常的做法是:node.parentNode ...
- 0.96寸OLED显示屏驱动手册(SSD1306)
MCU IIC接口 IIC通信接口由从地址位SA0,IIC总线数据信号SDA(输出SDAout/D2和输入SDAin /D1)和IIC总线时钟信号SCL(D0).不管是数据线还是时钟线都需要连接上拉电 ...
- 使用elementui树形控件写项目小结
使用tree pagination serch table 实现功能 项目难点主要解析后台传递的代码,线性转树形,这儿加上一个大神的解析 https://blog.csdn.net/dandanzmc ...
- css3基本选择器+属性选择器+动态伪类+UI状态伪类+结构类
后代选择器 祖先元素 后代元素{ } 子元素选择器(直接子元素选择器) 父元素>子元素{ } 兄弟选择器 元素+兄弟元素(紧邻该元素之后的下一个兄弟元素) 所有兄弟元素选择器 元素~兄弟元素(该 ...
- navicate premium连接sqlserver时报08001错误的解决方法
---恢复内容开始--- navicate premium连接sqlserver时报08001错误的解决方法 1.自己一直使用navicate连接sqlserver,但是自从自己的电脑安装了sqlse ...
- 安装ubuntu到移动硬盘(UEFI+GPT),实现在别的电脑也可以使用(详细教程)
前置说明:博主小白,第一次安装ubuntu,参考了网上很多人的教程,发博记录一下自己的安装过程.由于有些地方博主理解较浅或者因为机器硬件等各方面原因,本教程适用有限,仅供参考. 1.准备工作 win系 ...
- ubuntu---CUDA版本与NVIDIA显卡驱动版本对应关系查询
https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html ,如果不是CUDA 10.2 版本的,可以类似的查找 CUDA x ...