目录

  • 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 项目概述的更多相关文章

  1. Servlet学习之web服务器Tomcat 详解

    Web服务器是什么 Web服务器是指驻留于因特网上某种类型计算机的程序.当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该文 ...

  2. 于网站主机,DNS,域名解析,Web服务器关系详解

    /*本文将介绍网站主机,DNS,域名解析,Web服务器关系,转载请保留以下版权*/ /*启明星工作室 www.dotnetcms.org  提供会议室预定系统,请假系统,helpdesk,工作日志系统 ...

  3. Mac下Intellij IDea发布Web项目详解一

    Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intellij IDea发布J ...

  4. Mac下Intellij IDea发布Java Web项目详解五 开始测试

    测试前准备工作目录 Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intell ...

  5. JAVA Eclipse使用Maven构建web项目详解(SSM框架)

    tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...

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

    tomcat通过conf-Catalina-localhost目录发布项目详解   Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目 ...

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

    本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1       环境安装及分配 Maven是基于项目对象模 ...

  8. Redis 配置文件 redis.conf 项目详解

    Redis.conf 配置文件详解 # [Redis](http://yijiebuyi.com/category/redis.html) 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, ...

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

    net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的H ...

随机推荐

  1. .net 用反射获取当前运行的程序集中的所有Controller与Action

    public string InitPermission() { // 通过反射加载程序集 // var baseType = Assembly.LoadFile(@"G:\testproj ...

  2. 装饰器(Python)

    装饰器(decorators)是 Python 的一个重要部分.简单地说:装饰器是修改其他函数的功能的函数,能让我们的代码更容易被扩展,更加简短.举个例子: def login(): print(&q ...

  3. JS DOM用不同方法获取节点及对节点插入、复制和移除

    操作节点的方法 appendChild() insertBefore() replaceChild() cloneNode() normalize() splitText() sppendChild( ...

  4. vue2.0嵌套组件之间的通信($refs,props,$emit)

    vue的一大特色就是组件化,所以组件之间的数据交互是非常重要,而我们经常使用组件之间的通信的方法有:props,$refs和emit. 初识组件之间的通信的属性和方法 props的使用 子组件使用父组 ...

  5. ihandy2019笔记编程真题

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. Object类、日期时间类、system类及StringBuilder字符串容器

    一.Object类常用API 1.1 概述 java.lang.Object类是Java语言中的根类,即所有类的父类.Object类中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是 ...

  7. 吴裕雄--天生自然 python开发学习笔记:Git安装配置流程

  8. Java-天平称重

    题目: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81 则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中).本题 ...

  9. Django中非视图函数获取用户对象

    今天遇到了一个问题:在Django中怎么从非视图函数中获取用户对象?怎么保证不同的请求获取到不同的用户对象? 平常我们获取用户对象使用的是: request.user 不得不说,这确实很方便. 但是, ...

  10. Spark学习之路 (二十八)分布式图计算系统[转]

    引言 在了解GraphX之前,需要先了解关于通用的分布式图计算框架的两个常见问题:图存储模式和图计算模式. 图存储模式 巨型图的存储总体上有边分割和点分割两种存储方式.2013年,GraphLab2. ...