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
    

更多資料

  • 關注公眾號【兩猿社】,進入公眾號
  • 帶你豐富互聯網相關項目經驗,輕松應對校招!!!
  • 項目模塊詳細講解,在公眾號內持續更新!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM