1. 程式人生 > 實用技巧 >1.1Nginx概述

1.1Nginx概述

Nginx概述
百度百科:
常見的HTTP服務
Nginx應⽤用場景
Nginx特性、優點
IO多路復⽤(epoll)
拓展1:IO複用:
拓展2:IO多路複用:
select
epool模型
輕量量級
功能模組少
程式碼模組化:
CPU親和(affinity)
sendfile
Nginx的架構
框架模型
兩種程序
模組化設計
Nginx特點:
正向代理
反向代理
負載均衡TOC

Nginx概述

參考:

百度百科:

Nginx是俄羅斯人研發的,應對Rambler的網站,並且2004年釋出的第一個版本。
Nginx (engine x) 是一個高效能的HTTP反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0釋出於2004年10月4日。

其將原始碼以類BSD許可證的形式釋出,因它的穩定性、豐富的功能集、示例配置檔案和低系統資源

的消耗而聞名。2011年6月1日,nginx 1.0.4釋出。

Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,並在一個BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等。

來源: https://baike.baidu.com/item/nginx/3817705?fr=aladdin

Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器(代理中介軟體)

,是一個開源且高效能、可靠的HTTP中介軟體、代理服務。

特點:開源,高效能,可靠的http中介軟體,代理服務,穩定性強,有豐富的配置例項,佔用記憶體小


常見的HTTP服務

nginx是一個http服務,那麼還有哪些常見的http服務呢?

  • HTTPD->Apache基金會(海量容易崩潰)
  • IIS->微軟
  • GWS->Google(不對外開放)
  • openrestry(基於nginx+lua開發)->;
  • tengline->淘寶基於Nginx開發
  • lighttpd->;

Nginx應⽤用場景

  • 靜態處理理
  • 反向代理理
  • 負載均衡
  • 資源快取
  • 安全防護
  • 訪問限制
  • 訪問認證

Nginx特性、優點

  • IO多路複用(epoll)
  • 輕量級
  • CPU親和(affinity)
  • sendfile

IO多路復⽤(epoll)

拓展1:IO複用:

並行處理整個IO請求,一個socket處理多個請求,上圖使用的是多執行緒方式.

拓展2:IO多路複用:

多個描述符的I/O操作都能在一個執行緒內併發交替地順序完成,這就叫I/O多路複用,這裡的"複用"指的是複用同一個執行緒

比如老師給學生解答問題,

  • 普通的並行就是多個老師對應多個學生,看著學生,隨時準備回答問題;浪費資源;
  • IO多路複用就是,學生有問題主動上報給老師,老師再去回答問題,省資源。
  • Nginx基於IO多路復⽤
  • IO複用(主動上報)解決的是併發性的問題, Socket作為複用;

    對於IO請求的時候,請求預設都是阻塞狀態,當一個IO初始化、可用的時候,核心態會主動上報,喚醒對應的程序進行處理

  • IO多路復⽤的實現⽅式有selectpollepoll(Nginx使用的就是這個),select和epoll是Linux下常用的多路複用模型

select

最先出現,select會一直遍歷應用的的所有需要IO操作的程序,線性遍歷。

一直遍歷應用,找返回的.

select缺點

  1. 能夠監視⽂件描述符的數量存在最⼤限制(預設1014)
  2. 線性遍歷掃描效率低下

epool模型
  1. 每當FD就緒,採⽤系統的回撥函式之間將 fd放⼊ ,效率更⾼。
  2. 最⼤連線⽆限制

輕量量級

特點

  • 功能模組少
  • 程式碼模組化

功能模組少

原始碼只保留了跟HTTP以及它相關核心功能的那一部分核心模組的程式碼;一些不夠核心,或者是一些類似於可以作為外掛式的來進行安裝的,不會被整合在nginx的原始碼裡面.

  • 好處:效能高,
  • 缺點:不夠全面,外掛少;

程式碼模組化:

  • 易讀
  • 容易進行二次改進,對開發人員友好

CPU親和(affinity)

Nginx利用了CPU親和提升併發處理能力和對CPU的工作實際效率,減少不必要的額外效能損耗.

Nginx有多個worker程序處理工作, 將CPU核⼼和Nginx⼯作程序worker繫結,把每個 worker程序固定在一個cpu上執行,減少切換 cpu的 效能損耗 ,獲得更好的效能。

為了防止nginx使用的時候被影響,一般會採取這些操作

關閉iptables:
    iptables -L  #檢視是否開啟
    iptables -F #關閉
    iptables -t nat -L   #檢視net中是否有規則
    iptables -t nat -F  #關閉nat規則
停用selinux:
    getenforce #檢視是否關閉  disabled 代表關閉了
    setenforce 0 #關閉

sendfile

正常情況下,使用者獲取一個檔案的時候,通過作業系統的核心空間和使用者空間,到達socket,然後通過response給使用者

但是實際上,靜態檔案是不需要通過使用者空間的,因此這種方式浪費資源。

使用sendfile就不需要進入使用者空間,提高效率

Nginx的架構

框架模型

  • Master 程序:監視工作程序的狀態;當工作程序死掉後重啟一個新的;處理訊號和通知工作程序。
  • Worker 程序:處理客戶端請求,從主程序處獲得訊號做相應的事情。
  • Cache Loader 程序:載入快取索引檔案資訊,然後退出。
  • Cache Manager程序:管理磁碟的快取大小,超過預定值大小後最少使用資料將被刪除。

兩種程序

Nginx有兩種程序,一個master(主程序)程序,一種是worker(工作程序)((一個(windows版本的目前只有一個)或者多個))程序。

流程:

  • 主程序(Master)並不處理網路請求,主要負責排程工作程序:載入配置、啟動工作程序非停升級

    或者說是:監視工作程序的狀態;當工作程序死掉後重啟一個新的;處理訊號和通知工作程序。

    所以,nginx啟動以後,檢視作業系統的程序列表,我們就能看到至少有兩個nginx程序。

  • 工作程序(worker):實際處理網路請求及響應的.

    在類unix系統上,nginx可以配置多個worker,而每個worker程序都可以同時處理數以千計的網路請求。

worker程序的數量當然也不是越多越好,實際調優的時候,一般要根據cpu 的數量而定。

為什麼這幾個worker程序卻能支撐上萬甚至上十萬的併發呢?

原因是Nginx設計的時候是基於非阻塞式的方式,能做到非阻塞是因為它的執行緒模型是基於Linux裡面的epoll/select模型,這個也類似於我們java中nio的多路複用選擇器模型。事件驅動加上非同步非阻塞的io模型,可以說是nginx得以獲得高併發、高效能的關鍵因素。同時學過netty的同學會發現,底層是有很多相似之處的。

模組化設計

Nginx還有一個特點就是模組化設計。nginx的worker,包括核心和功能性模組;

  • 核心模組負責維持一個執行迴圈(run-loop),執行網路請求處理的不同階段的模組功能,如網路讀寫、儲存讀寫、內容傳輸、外出過濾,以及將請求發往上游伺服器等。

其程式碼的模組化設計,也使得我們可以根據需要對功能模組進行適當的選擇和修改,編譯成具有特定功能的伺服器。

Nginx的核心模組

Nginx特點:

正向代理,反向代理 負載均衡 動靜分離...

  • 正向代理:需要我們使用者,手動的設定代理伺服器的ip和埠號
  • 反向代理:用來代理伺服器的,使用者不需要設定.
  • 負載均衡:
    原理就是資料流量分攤到多個伺服器上執行,減輕每臺伺服器的壓力,
    多臺伺服器共同完成工作任務,從而提高了資料的吞吐量
  • 動靜分離:
    靜態的資源放到反向伺服器,節省使用者的訪問時間.

正向代理

比如在如今的網路環境下,我們如果由於技術需要要去訪問國外的某些網站,此時你會發現位於國外的某網站我們通過瀏覽器是沒有辦法訪問的,此時大家可能都會用一個操作FQ進行訪問,FQ的方式主要是找到一個可以訪問國外網站的代理伺服器,我們將請求傳送給代理伺服器,代理伺服器去訪問國外的網站,然後將訪問到的資料傳遞給我們!

上述這樣的代理模式稱為正向代理,正向代理最大的特點是客戶端非常明確要訪問的伺服器地址;伺服器只清楚請求來自哪個代理伺服器,而不清楚來自哪個具體的客戶端;正向代理模式遮蔽或者隱藏了真實客戶端資訊。

正向代理特點:

  • 正向代理服務是由客戶端設立的。
  • 客戶端了解代理伺服器和目標伺服器都是誰。
  • 幫助實現突破訪問許可權,提高訪問的速度,對目標伺服器隱藏客戶端的ip地址.

反向代理

反向代理( Reverse Proxy )方式是指以代理伺服器來接受 internet 上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給 internet 上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。

舉例如我大天朝的某寶網站,每天同時連線到網站的訪問人數已經爆表,單個伺服器遠遠不能滿足人民日益增長的購買慾望了,此時就出現了一個大家耳熟能詳的名詞:分散式部署;也就是通過部署多臺伺服器來解決訪問人數限制的問題;某寶網站中大部分功能也是直接使用nginx進行反向代理實現的,並且通過封裝nginx和其他的元件之後起了個高大上的名字:Tengine。

通過上述的圖解大家就可以看清楚了,多個客戶端給伺服器傳送的請求,nginx伺服器接收到之後,按照一定的規則分發給了後端的業務處理伺服器進行處理了。此時,請求的來源也就是客戶端是明確的,但是請求具體由哪臺伺服器處理的並不明確了,nginx扮演的就是一個反向代理角色。

反向代理,主要用於伺服器叢集分散式部署的情況下,反向代理隱藏了伺服器的資訊

同時上面的例子也是最經典的負載均衡功能,這種方式能直接的提高併發能力。

反向代理特點:

  • 反向代理伺服器是配置在服務端的。
  • 客戶端是不知道訪問的到底是哪一臺伺服器。
  • 達到負載均衡,並且可以隱藏伺服器真正的ip地址。

請求發出之後,先到達反向代理伺服器,反向代理伺服器從伺服器中選擇一個處理請求

負載均衡

負載均衡,英文名稱為Load Balance,是指建立在現有網路結構之上,並提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。其原理就是 資料流量分攤 到多個伺服器上執行,減輕每臺伺服器的壓力,多臺伺服器共同完成工作任務,從而提高了資料的吞吐量。



來自為知筆記(Wiz)