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

更多资料

  • 关注公众号【两猿社】,进入公众号
  • 带你丰富互联网相关项目经验,轻松应对校招!!!
  • 项目模块详细讲解,在公众号内持续更新!!!

原文地址:https://www.cnblogs.com/qinguoyi/p/12348439.html

时间: 2024-10-31 09:32:57

Web服务器项目详解 - 00 项目概述的相关文章

直播项目详解

项目下载地址 项目文件结构: Login : 登录页面集成了友盟第三方登录微信和QQ,新浪授权登录是请求新浪官方的OAuth请求,以及一些登录所需要的资源 Main :主要包含标签视图控制器UITabBarController .导航控制器UINavigationController.数据请求工具类XLLiveTool.业务逻辑类XLDealData.代理类.pch文件和单例的头文件,都是一些全局都能用的东西. Home : 首页,主要包括热门,最新和关注三部分,把这三部分添加到(XLHomeV

net core 中间件详解及项目实战

net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章对你有用的话,不妨点个[推荐]. 目录 中间件(Middleware)的作用 中间件的运行方式 中间件(Middleware)和过滤器(Filter)的区别 什么情况我们需要中间件 怎么样自定义自己的中间件 中间件(Middleware)的作用 我们知道,任何

eclipse里面构建maven项目详解(转载)

本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1       环境安装及分配 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.Maven主要服务于基于java平台的项目构建.依赖管理和项目信息管理,无论是小型的开源类库项目,还是大型的企业级应用,maven都能大显身手. 置于maven的安装过程及在eclipse里面配置maven,请看我在

tomcat通过conf-Catalina-localhost目录发布项目详解 摘自:http://www.cnblogs.com/iyangyuan/archive/2013/09/12/3316444.html

Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目录下添加配置文件,来发布项目,是最佳选择. 因为这样对tomcat的入侵性最小,只需要新增一个配置文件,不需要修改原有配置:而且支持动态解析,修改完代码直接生效(修改配置除外). 但是网上关于这种方法的介绍很简单,小菜来补充一下. 1.直接在eclipse中添加一个server,添加过程中指明tomcat的路径即可. 2.在tomcat服务器的conf\Catalina\local

tomcat通过tomcat 安装根目录下的conf-Catalina-localhost目录发布项目详解

tomcat通过conf-Catalina-localhost目录发布项目详解 Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目录下添加配置文件,来发布项目,是最佳选择. 因为这样对tomcat的入侵性最小,只需要新增一个配置文件,不需要修改原有配置:而且支持动态解析,修改完代码直接生效(修改配置除外). 但是网上关于这种方法的介绍很简单,小菜来补充一下. 1.直接在eclipse中添加一个server,添加过程中指明tomca

[转帖](整理)GNU Hurd项目详解

(整理)GNU Hurd项目详解 http://www.ha97.com/3188.html 发表于: 开源世界 | 作者: 博客教主 标签: GNU,Hurd,详解,项目 Hurd原本是要成为GNU操作系统的真正内核,然而它从未真正降临人间.Linus Torvalds曾经写过,如果GNU kernel在1991年春天发布,他不会启动Linux项目.GNU操作系统项目始于1984年,在Linux出现之前它有7到8年的时间创造出一个可用的内核,然而它的开发进程,不时被频繁的改变中断.Richar

Web.xml配置详解(转)

Web.xml配置详解 Posted on 2010-09-02 14:09 chinaifne 阅读(295105) 评论(16) 编辑 收藏 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义).

web.xml配置详解(2)

1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义).所有部署描述符文件的顶层(根)元素为web-app.请注意,XML元素不像HTML,他们是大小写敏感的.因此,web-App和WEB-APP都是不

Django之HttpServer服务器分析详解

大家知道,软件的正向工程,是从软件的需求获取开始,大概经历需求分析,概要分析,领域分析,设计分析,详细设计,代码实现,部署,实施这几个步骤,最终交付给用户使用.而在某些时候,比如某个软件产品是用PHP开发的,因为某些原因,我们想移植到JAVA平台去.或者某公司看到某个软件的市场前景很好,想COPY它的主要功能,然后经过加工润色后推出一个具有相同功能,更好用户体验或更多功能的软件.或者单纯的以研究软件的结构.设计思想为目的.基于这些需求,我们需要逆向工程.正向工程是一个从过程导出结果的步骤,而逆向