小六聊聊-nginx的實現原理


什麼是nginx

Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器javascript

nginx 目前有那些功能

  1. 靜態服務器
  2. 正向代理
  3. 反向代理
  4. 負載均衡
  5. 資源緩存

nginx的原理

基礎知識 C/S模式

C-S 模式 Client-Server 模式 也叫 客戶端-服務器模式 客戶端和服務器之間約定好各類協議,客戶端輸入指令 服務器返回計算結果java

基礎知識 Http 協議

Http 協議頭

Http_Head 以 \r\n 換行nginx

瀏覽器將 協議頭 發送至服務器git

Request Method: GET
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: BIDUPSID=6FDCB80C810B35D150145FAB9A30365B;
Host: www.baidu.com
Referer: https://www.baidu.com/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
X-Requested-With: XMLHttpRequest
複製代碼

Http 協議簡單認知

HTTP是基於客戶/服務器模式,且面向鏈接的。典型的HTTP事務處理有以下的過程github

  1. 客戶與服務器創建鏈接;web

  2. 客戶向服務器提出請求;後端

  3. 服務器接受請求,並根據請求返回相應的文件做爲應答;瀏覽器

  4. 客戶與服務器關閉鏈接。緩存

基礎知識 OS

Socket 的 文件描述符fdbash

socket中的fd:fild descriptor,就是一個套接字描述器。

在UNIX中的一切事物都是文件(everything in Unix is a file!) 咱們用int在描述socket,實際上,全部的文件描述符都是int,用的是一個整數類型。 文件是應用程序與系統(包括特定硬件設備)之間的橋樑,而文件描述符就是應用程序使用這個「橋樑」的接口。在須要的時候,應用程序會向系統申請一個文件,而後將文件的描述符返回供程序使用。返回socket的文件一般被建立在/tmp或者/usr/tmp中。咱們實際上不用關心這些文件,僅僅可以利用返回的socket描述符就能夠了。

Unix/Linux 一切皆文件

一切對文件的操做 read write ... 都離不開文件描述符FD (Id)

FD 在OS的進程(Process)中經過轉換 指向了文件所在的首地址,用來操做文件


靜態資源服務器

靜態資源服務器基本設計

靜態資源服務器 遵照 HTTP 協議 一來一回的將用戶所須要的信息返回到瀏覽器客戶端

靜態資源服務器 須要有容器的根路徑 / 用來請求資源時 經過跟路徑查找

靜態資源服務器 須要根據用戶求情資源的不用 以字節流或字符流的形式向外輸出 如 圖片HTML

靜態資源服務器 須要支持高併發狀況下的資源請求

靜態資源服務器時序圖

如何將基本知識點鏈接起來 構建成一個靜態服務器

僞代碼-思路

socket c_socket;
    linsten(&c_socket)
    while(1){
        fd = accept(&c_socket)
        recevice_data = analuse_head(fd)
        write(fd,resource(recevice_data))
        close(fd)
    }   
複製代碼

正向代理

正向代理,意思是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。客戶端才能使用正向代理。

正向代理本身便是Brower的Server端 又是 Ori_Server的客戶端

僞代碼-思路

socket c_socket;
    socket s_socket;
    linsten(&c_socket)
    while(1){
        fd = accept(&c_socket)
        recevice_data = analuse_head(fd)

        ip,port = find_routing_table(recevice_data)
        // 服務器做爲客戶端僞代碼
        s_fd = connect(s_socket)
        send(s_fd,relace_data(recevice_data))
        data_buf = read(s_fd)
        //向客戶端輸出
        write(fd,data_buf)
        close(fd)
    }   


複製代碼

正向代理用例圖

反向代理

反向代理是代理服務器的一種。服務器根據客戶端的請求,從其關聯的一組或多組後端服務器(如Web服務器)上獲取資源,而後再將這些資源返回給客戶端,客戶端只會得知反向代理的IP地址,而不知道在代理服務器後面的服務器簇的存在

反向代理用例圖

負載均衡

分攤到多個操做單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工做任務

  1. 輪詢

    代理的多臺服務器 將按照順序 一個個的向源服務器發送請求

  2. 隨機

    代理的多臺服務器 將隨機的向源服務器發送請求

  3. Hash

    代理的多臺服務器 將根據消費者客戶端的IP 算出Hash值 算出的Hash值和服務器地址取模運算 定位出要訪問的服務器地址

  4. 最小鏈接次數

    代理的多臺服務器 記錄下每一個服務器目前爲止的鏈接次數,下一個鏈接到來時 將優先使用目前鏈接次數最少的服務器

資源緩存

靜態文件如CSS js Image 這些不變的文件,若是相同的請求地址過來後,靜態資源服務器已經緩存 沒必要再去原始服務器中獲取資源,直接將本地已經緩存的數據發送至客戶端,如沒有在進行二次請求


以上構成本身的 mini_nginx


過往文章

  1. 小六聊聊-聊天工具的實現原理
  2. 小六聊聊-對戰平臺的實現原理
  3. 小六聊聊-nginx的實現原理

本身動手寫聊天工具

mini_chat 代碼地址

本身動手寫Nginx

mini_nginx 代碼地址

相關文章
相關標籤/搜索