Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器javascript
C-S 模式 Client-Server 模式
也叫 客戶端-服務器模式 客戶端和服務器之間約定好各類協議,客戶端輸入指令 服務器返回計算結果java
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事務處理有以下的過程github
客戶與服務器創建鏈接;web
客戶向服務器提出請求;後端
服務器接受請求,並根據請求返回相應的文件做爲應答;瀏覽器
客戶與服務器關閉鏈接。緩存
Socket 的 文件描述符fd
bash
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服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工做任務
代理的多臺服務器 將按照順序 一個個的向源服務器發送請求
代理的多臺服務器 將隨機的向源服務器發送請求
代理的多臺服務器 將根據消費者客戶端的IP 算出Hash值 算出的Hash值和服務器地址取模運算 定位出要訪問的服務器地址
代理的多臺服務器 記錄下每一個服務器目前爲止的鏈接次數,下一個鏈接到來時 將優先使用目前鏈接次數最少的服務器
靜態文件如CSS js Image 這些不變的文件,若是相同的請求地址過來後,靜態資源服務器已經緩存 沒必要再去原始服務器中獲取資源,直接將本地已經緩存的數據發送至客戶端,如沒有在進行二次請求
以上構成本身的 mini_nginx