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 ...
随机推荐
- STT-MRAM万能存储器芯片
传统存储器的技术局限以及不断缩小的制造尺寸所带来的巨大挑战促使科研人员开始寻找新一代存储器件,它应具有接近静态存储器的纳秒级读写速度,具有动态存储器甚至闪存级别的集成密度和类似Flash的非易失性存储 ...
- vue搭建手顺
1.环境准备:node.js vue-cli: $ npm install vue-cli -g 2.建立项目目录:vuedemo,并cd到该目录下 3.$ vue init webpack vu ...
- 个性化和云端孤岛困扰SaaS用户,低代码PaaS或成解决之道 ZT
近日,中国软件行业协会.中国软件网联合阿里云推出了<2020中国SaaS产业十大趋势>,其中明确指出企业软件SaaS化是大势所趋,但个性化和云端孤岛成为2020年SaaS用户关注的两大问题 ...
- idea将普通项目转换为maven项目
方式一 1.在项目根目录下,新建文件 pom.xml,并填写好内容. 2.在pom.xml文件上,右键 Add as Maven Project 或 在项目上,右键 Add Framework Sup ...
- Android实战项目——家庭记账本设计思路
经过三周左右的Android学习,实感只有上手开发才能有所提高.在此打算做一个家庭记账APP,同时巩固一下学到的东西并且弥补漏洞. 概述 记账是自古以来人类必不可少的一件事,从古代的算盘,到手写账本, ...
- Redis 安装 (未)
Redis 安装步骤 1. 下载地址 2. 版本选择 3. 配置主要参数 4. 关联操作
- Visual Studio 2017中使用gulp编译sass/scss
在Visual Studio 2017中使用gulp编译sass/scss文件 需要的环境:Visual Studio 2017.Node.js.npm 在vs2017中 [视图]-[其他窗口]-[任 ...
- Django---Django安装数据库
前面我们介绍了如何通过Django完成数据的接收和数据交互,那么我们都知道,数据一般都是通过数据库存储的,然而我们作为测试肯定和数据库也是经常打交道的,今天就简单的介绍下,如何在windows上安装数 ...
- [P5665][CSP2019D2T2] 划分
先说说部分分做法吧 1.\(n \leq 10\) 指数级瞎草都可以2333 2.\(n \leq 50\) 好像并没有什么做法-也许给剪枝的人部分分吧 3.\(n \leq 400\) 这个复杂度是 ...
- PTA 1004 Counting Leaves
题目描述: A family hierarchy is usually presented by a pedigree tree. Your job is to count those family ...