文章目錄
一. 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
分配客戶端請求:每個請求按訪問ip
的hash
結果分配處理請求的後端服務器,這樣每個訪客固定一個後端服務器,即可以解決Session
問題。 - ④:通過
fair(第三方模塊)
來分配請求:但後端服務器的響應時間來分配請求,響應時間短的優先分配。
四. Nginx 動靜分離
1. 動靜分離概念
- 即分開動態請求和靜態請求
- 可以理解爲用 Nginx 處理靜態頁面,Tomcat 處理動態頁面。
2. 動靜分離分類
- 動靜分離從實現角度來講大致分爲兩類
- ①:一種是把靜態文件單獨成獨立的域名,放在獨立的服務器上,這也是目前主流推崇的方案。
- ②:一種是動態文件和靜態文件混合在一發布,通過 Nginx 來分開。
- 上圖省略了響應
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 配置文件整體結構
http 塊結構:
server 塊結構:
- 即:每個
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;