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 ...
随机推荐
- Ubuntu安装软件时报 Unable to acquire the dpkg frontend lock解决方案
解决方案如下: 对于以上内容,请等待过程完成.如果这没有发生,请在终端中运行: sudo killall apt apt-get 如果以上都不起作用,请删除锁定文件.在终端中运行: sudo rm / ...
- KVM | centos 安装 window 虚拟机
KVM | centos 安装 window 虚拟机 环境: CENTOS 7.3 1. 准备 1.1 检查是否支持虚拟化 cat /proc/cpuinfo | egrep 'vmx|svm' 要求 ...
- python中class的定义及使用
#类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法. #对象:它是类的实例化. #方法:类中定义的函数. #类(Class) 由3个部分构成: ...
- 有多少人在面试时,被Java 如何线程间通讯,问哭了?
正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点: thread.join(), object. ...
- linq to sql 比较字符串形式的时间
where Convert.ToDateTime(t.Date.Trim()).CompareTo(Convert.ToDateTime("2009/9/9")) >= 0 ...
- demo ‘todolist’项目开发
todolist-site-----------主文件夹 css------------css文件文件夹 header.css---主页面头部样式css section.css---主页面内容样式cs ...
- 在系统下使用命令安装gnome图形界面程序
yum groupinstall "GNOME Desktop" "Graphical Administration Tools" reboot 记得别忘了更新 ...
- Spring Aop和Spring Ioc(一)
Spring Aop Aop: 面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来. 1:主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等. 2 ...
- openlayers添加弹出框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- R语言的内存(小总结)
memory.size()----->查看当前的内存的使用情况. memory.limit()------->当前的工作空间的最大内存容量. ls()-------->查看当前的内存 ...