Nginx 筆記

一. Nginx基本概念

1. Nginx 是什麼?可以做什麼?
  • Nginx 是一個高性能的 HTTP 和反向代理 Web 服務器,同時也提供了 IMAP, POP3, SMTF 等服務。
  • Nginx 是一個跨平臺服務器,可以運行在 Linux, Windows, FreeBSD, Solaris, AIX, Mac OS等操作系統上。
  • Nginx 支持熱加載 熱部署 ,在不打斷用戶請求的情況下更新版。
  • 百度,京東,新浪,網易,淘寶均用了 Nginx。

2. Nginx 原理是什麼?
  • Nginx 採用了高度模塊化的設計思路,並且內部的進程主要有兩類:master 進程 和 worker 進程。其中master進程只有一個,worker進程可以有多個。
  • worker進程纔是真正working的進程,纔是真正處理請求的進程。worker 進程全部都是 master 進程的子進程。worker 進程是以普通用戶的身份進行運行的,這樣就可以極大增加程序的安全性。就算是萬一有一個進程被劫持,那也不會有管理員權限。
  • Nginx 的熱部署和其併發模型有着密不可分的關係。說白了,就是因爲 master 進程的關係。當通知 ngnix 重讀配置文件的時候,master 進程會進行語法錯誤的判斷。如果存在語法錯誤的話,返回錯誤,不進行裝載;如果配置文件沒有語法錯誤,那麼 ngnix 也不會將新的配置調整到所有 worker 中。而是,先不改變已經建立連接的 worker,等待 worker 將所有請求結束之後,將原先在舊的配置下啓動的 worker 殺死,然後使用新的配置創建新的 worker

3. 一個 master,多個 worker 進程的好處是什麼?
  • ①:可以進行熱部署,修改完配置文件之後,不需要重新啓動,採用重新加載./nginx -s reload命令既可以重新加載配置文件。即不需要暫停服務就可以平滑升級系統。
  • ②:首先,對於每一個worker_process來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷;同時在編程以及查找問題時,也會方便很多。其次,採用獨立的進程,可以相互之間不會影響,一個進程退出後,其他進程還在工作,服務不會中斷,master_process進程可以給很快啓動新的worker_process
  • ③:當然,worker_process進程的異常退出肯定是程序有bug,異常退出會導致當前worker上的所有請求處理失敗,不過不會影響所有的請求,因爲其他的worker還在正常工作,所以降低了風險。

4. 一個請求佔用了多少個 worker_connection 的連接數?
  • 兩個或者四個
  • 如果只訪問靜態資源,則“一來一回”,佔用兩個worker_connection
  • 如果還有訪問動態資源,則“二來二回”,佔用四個worker_connection
  • 據此可以算出系統可以承受的最大併發量(最大併發請求數量)。

5. 需要設置多少個 worker 進程?
  • worker數和CPU數相等時最適宜的。
  • Nginx 採用的是I/O 多路複用機制,每個worker都是一個獨立的進程,且每個進程裏只有一個主線程,通過異步非阻塞的方式來處理請求,即使是成千上萬的請求也沒有問題,每個worker的線程可以把一個CPU的性能發揮到極致,所以,worker數和CPU數相等時最爲適宜的,設置少了會浪費CPU,設置多了會造成CPU頻繁的上下文切換,這會帶來額外的開銷。

二. Nginx 反向代理

1. 正向代理以及反向代理概念
  • 正向代理:在客戶端(瀏覽器)配置代理服務器,通過代理服務器進行互聯網訪問就是正向代理。
  • 反向代理:我們(客戶端)將請求發送到代理服務器,由代理服務器去選擇目標服務器,或獲取數據後再返回給客戶端,此時代理服務器和目標服務器就是一個整體,我們感受不到代理服務器的存在,暴漏的是代理服務器的地址,隱藏了真實目標服務器的 IP 地址。
  • 或者這樣說:反向代理(Reverse Proxy)方式是指以代理服務器來接受 Internet 上的連接請求,然後將請求轉發給內部網絡上的服務器;並將從服務器上得到的結果返回給 Internet 上請求連接的客戶端,此時代理服務器對外就表現爲一個服務器。

2. 反向代理優點
  • 安全性:對外暴漏的是代理服務器的地址,隱藏了真實目標服務器的 IP 地址。
  • 速度快:配合動靜分離技術以及負載均衡技術來使用,可以使高併發條件下系統的響應速度以及穩定性大大提高。

3. 反向代理配置實例

三. Nginx 負載均衡

1. 負載均衡概念
  • 背景:來自客戶端的訪問量日益增大,單個服務器解決不了高併發請求,這時我們可以增加服務器的數量,然後將請求根據不同的策略分發到不同的服務器上,即將負載分發到不同的服務器上,即我們所說的負載均衡。

2. 負載均衡配置實例

3. 負載均衡策略
  • ①:默認是輪詢:每個請求按時間順序逐一分配到不同的後端服務器,如果某一後端服務器當掉,則將請求發送到另外的服務器,並自動剔除宕掉的服務器。
  • ②:通過weight = n 分配轉發權重:權重默認爲1,權重越大,分配到的客戶端請求越多。
  • ③:通過ip_hash分配客戶端請求:每個請求按訪問iphash結果分配處理請求的後端服務器,這樣每個訪客固定一個後端服務器,即可以解決Session問題。
  • ④:通過fair(第三方模塊)來分配請求:但後端服務器的響應時間來分配請求,響應時間短的優先分配。

四. Nginx 動靜分離

1. 動靜分離概念
  • 即分開動態請求和靜態請求
  • 可以理解爲用 Nginx 處理靜態頁面,Tomcat 處理動態頁面。

2. 動靜分離分類
  • 動靜分離從實現角度來講大致分爲兩類
  • ①:一種是把靜態文件單獨成獨立的域名,放在獨立的服務器上,這也是目前主流推崇的方案。
  • ②:一種是動態文件和靜態文件混合在一發布,通過 Nginx 來分開。
動態請求
靜態請求
html, css, image
數據庫查詢
Client
Nginx
靜態資源服務器
Tomcat 服務器
  • 上圖省略了響應

3. 動靜分離配置實例

五. Nginx 高可用

1. 什麼是Nginx 高可用?
2. 高可用配置實例

六. Nginx 常用的操作命令

1. Nginx 常用命令
  • 使用 Nginx 命令的前提:必須進入 Nginx 目錄:cd usr/local/nginx/sbin
  • 常用命令:
  • ①:查看 Nginx 的版本:./nginx -V
  • ②:啓動 Nginx:./nginx
  • ③:關閉 Nginx:./nginx -s stop
  • ④:不關閉重新加載 Nginx:./nginx -s reload

2. Nginx 熱部署(平滑升級)
  • 當通知 ngnix 重讀配置文件的時候,master 進程會進行語法錯誤的判斷。如果存在語法錯誤的話,返回錯誤,不進行裝載;如果配置文件沒有語法錯誤,那麼 ngnix 也不會將新的配置調整到所有 worker 中。而是,先不改變已經建立連接的 worker,等待 worker 將所有請求結束之後,將原先在舊的配置下啓動的 worker 殺死,然後使用新的配置創建新的 worker。

七. Nginx 配置文件詳解

1.1 配置文件整體結構

{events http  \left\{ \begin{aligned} 全局塊 \\ events\ 塊 \\ http\ 塊 \end{aligned} \right.


http 塊結構:

{httpserver 1server 2...server n \left\{ \begin{aligned} http 全局塊 \\ server\ 塊_1\\ server\ 塊_2\\ ...\\ server\ 塊_n\\ \end{aligned} \right.


server 塊結構:
{serverlocation 1location 2...location n \left\{ \begin{aligned} server 全局塊 \\ location\ 塊_1\\ location\ 塊_2\\ ...\\ location\ 塊_n \end{aligned} \right.

  • 即:每個 http 塊可以有多個server 塊
  • 每個 server 塊可以有多個location 塊

1.2 全局塊
  • 全局塊主要設置一些影響Nginx服務器整體運行的配置命令,比如:
  • 設置運行Nginx服務器的用戶(組);
  • 允許生成的最大wprker_process數;
  • 進程PID存放路徑;
  • 日誌類型和日誌存放路徑 ;
  • 配置文件的引入等。
  • 其中,worker_process數越大,可以支持的併發處理量也越大,但會收到硬件,軟件等設備的制約。

1.3 events 塊
  • events塊涉及的配置指令主要影響Nginx服務器於用戶的網絡連接,常用的設置包括:
  • 是否開啓對多worker_process下的網絡連接進行序列化;
  • 是否允許同時接收多個網絡連接;
  • 選取哪種事件驅動模型來處理連接請求;
  • 設置每個worker_process可以同時支持的最大連接數等。
  • 這部分的配置對於Nginx性能的影響較大,在實際應用中應該靈活配置。

1.4 http 塊
  • 代理,緩存和日誌定義等絕大多數功能和第三方模塊的配置都在這裏。
  • Nginx 服務器中配置最頻繁的部分。
  • http 塊下也包含 http 全局塊server 塊

2. http 塊詳解
2.1. http 全局塊
  • http 全局塊配置的指令包括文件引入,MIME-TYPE定義,日誌定義,連接超時時間的設置,單鏈接請求數上限等。
2.2. server 塊
  • 這部分和虛擬主機有密切關係;
  • 虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術的產生是爲了節省互聯網服務器硬件成本問題。
  • 每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當於一臺虛擬主機。

3. server 塊詳解
3.1. 全局 server 塊
  • 最常見的配置是本虛擬主機的監聽配置和本虛擬機的名稱或 IP 配置。
3.2. location 塊
  • 一個 server 塊可以包括多個 location 塊。
  • 這塊的作用是處理 Nginx 服務器接收到的請求字符串(例如:server_name/uri_string);
  • 對虛擬主機名稱(也可以是 IP 別名)之外的字符串(例如:uri_string)進行匹配,對特定的請求進行處理,地址定向,數據緩存以及應答控制等功能。
  • 還有許多第三方模塊的設置也在這裏。

4. location 塊正則表達式
  • ①:精確匹配=

    location = /index {
    	configration A
    }
    
  • URL 執行http://{dimain_name}/index時,纔會執行配置中的操作。


  • ②:波浪號~

  • 波浪號~表示執行正則匹配,但區分大小寫

    location ~/page/\d{1,2} {
    	configuration B
    }
    
  • URL 爲http://{domain_name}/page/num,且num是1~99時執行配置中的操作。


  • ③:波浪號與星號~*

  • 波浪號與星號~*表示執行正則匹配,但是不區分大小寫

    location ~*/\.(jpg|jpeg|gif) {
    	configration C
    }
    
  • 匹配所有 URL 以.jpg.jpeg.gif結尾時生效,執行配置中的操作。


  • ④:脫字符^和波浪號~
  • 表示執行正則匹配,前綴匹配成功則配置生效
    location ^~/image/ {
    	configration D
    }
    
  • URL 爲http://{domain_name}/iamge/xxxx生效,執行配置中的操作。

  • ⑤:艾特號@

  • 用於定義一個location,用於處理內部重定向。

    location @error {
    	proxy_pass http://error;
    }
    error_page 404 @error;
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章