Nginx搭建、反向代理、負載均衡、動靜分離以及底層進程機制詳解
一、前言
1、什麼是Nginx?
Nginx
是一個高性能的HTTP
和反向代理web
服務器,核心特點是佔有內存少,併發能力強。
2、Nginx的應用場景
-
Http服務器(Web服務器)
性能非常高,非常注重效率,能夠經受高負載的考驗。
支持50000
個併發連接數,不僅如此,CPU
和內存的佔用也非常的低,10000個沒有活動的連 接才佔用2.5M的內存。 -
反向代理服務器
正向代理
在瀏覽器中配置代理服務器的相關信息,通過代理服務器訪問目標網站,代理服務器收到目標網站的響應之後,會把響應信息返回給我們自己的瀏覽器客戶端。反向代理
瀏覽器客戶端發送請求到反向代理服務器(比如Nginx
),由反向代理服務器選擇原始服務器提供服務獲取結果響應,最終再返回給客戶端瀏覽器。 -
負載均衡服務器
負載均衡,當一個請求到來的時候(結合上圖),
Nginx
反向代理服務器根據請求去找到一個 原始服務器來處理當前請求,那麼這叫做反向代理。那麼,如果目標服務器有多臺,找哪一個目標服務器來處理當前請求呢,這樣一 個尋找確定的過程就叫做負載均衡。生活中也有很多這樣的例子,比如,我們去銀行,可以處理業務的窗口有多個,那麼我們會 被分配到哪個窗口呢到底,這樣的一個過程就叫做負載均衡。
負載均衡就是爲了解決高負載的問題。
-
動靜分離
3、Nginx的特點
- 跨平臺:
Nginx
可以在大多數類unix
操作系統上編譯運行,而且也有windows
版本。 Nginx
的上手非常容易,配置也比較簡單。- 高併發,性能好。
- 穩定性也特別好,宕機概率很低。
二、Nginx搭建
1、安裝Nginx依賴,pcre、openssl、gcc、zlib(推薦使用yum源自動安裝)
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2、下載Nginx
wget http://nginx.org/download/nginx-1.17.8.tar.gz
3、解包Nginx軟件包
tar -zxvf nginx-1.17.8.tar.gz
4、進入解壓之後的目錄 nginx-1.17.8
cd nginx-1.17.8
5、命令行執行./configure
6、make
7、命令行執行 make install,完畢之後在/usr/local/下會產生一個nginx目錄
8、進入sbin目錄中,執行啓動nginx命令
cd nginx/sbin
./nginx
9、然後訪問服務器的80端口(nginx默認監聽80端口)
10、訪問自己的雲服務器不成功的話
阿里雲服務器需要設置安全組規則,配置下面的http
規則就行了。
11、Nginx主要命令
./nginx
啓動nginx
./nginx -s stop
終止nginx
(當然也可以找到nginx
進程號,然後使用kill -9
殺掉nginx
進程)./nginx -s reload
(重新加載nginx.conf
配置文件)
三、Nginx核心配置文件解讀
Nginx
的核心配置文件conf/nginx.conf
包含三塊內容:全局塊
、events塊
、http塊
1、全局塊
從配置文件開始到events
塊之間的內容,此處的配置影響nginx
服務器整體的運行,比如worker
進程的數量、錯誤日誌的位置等。
2、events塊
events
塊主要影響nginx
服務器與用戶的網絡連接,比如worker_connections 1024
,標識每個
workderprocess
支持的最大連接數爲1024
。
3、http塊
http
塊是配置最頻繁的部分,虛擬主機的配置,監聽端口的配置,請求轉發、反向代理、負載均衡等。
四、Nginx應用場景之反向代理
1、反向代理需求一
瀏覽器請求nginx(http://47.113.82.141:9003
),nginx
將請求轉發給了目標服務器,我們看到的是目標服務器的響應頁面。在整個過程中,目標服務器相當於對客戶端是不可見的,服務端向外暴露的就是nginx
的地址。
- 部署
tomcat
,保持默認監聽8080
端口 - 修改
nginx
配置 - 重新加載
nginx
配置
./nginx -s reload
- 測試,訪問
http://47.113.82.141:9003
,返回tomcat
的⻚面
2、反向代理需求二
在需求一的基礎上,目標服務器有兩個,分別是127.0.0.1:8080
、127.0.0.1:8081
。
當訪問http://47.113.82.141/9003/abc
的時候,實際訪問目標服務器127.0.0.1:8080
;
當訪問http://47.113.82.141/9003/def
的時候,實際訪問目標服務器127.0.0.1:8081
。
-
再部署一臺
tomcat
,保持默認監聽8081
端口 -
修改
nginx
配置,並重新加載 -
裏主要就是多
location
的使用,這裏的nginx
中server/location
就好比tomcat
中的Host/Context
location
語法如下:
location [=|~|~*|^~] /uri/ { ... }
在nginx
配置文件中,location
主要有這幾種形式:
- 正則匹配
location ~ /riemann { }
- 不區分大小寫的正則匹配
location ~* /riemann { }
- 匹配路徑的前綴
location ^~ /riemann { }
- 精確匹配
location = /riemann { }
- 普通路徑前綴匹配
location /riemann { }
優先級 4>3>2>1>5
五、Nginx應用場景之負載均衡
負載均衡需求:
新增一個tomcat
監聽8082
端口,當訪問http://47.113.82.141/9003/abc
,使用Nginx
作爲負載均衡器,將請求分配到127.0.0.1:8080
、127.0.0.1:8082
。
1、輪詢
默認策略,每個請求按時間順序逐一分配到不同的服務器,如果某一個服務器下線,能自動剔除。
upstream riemannServer{
server 47.113.82.141:8080;
server 47.113.82.141:8082;
}
location /abc {
proxy_pass http://riemannServer/;
}
2、weight
weight
代表權重,默認每一個負載的服務器都爲1,權重越高那麼被分配的請求越多(用於服務器
性能不均衡的場景)
upstream riemannServer{
server 47.113.82.141:8080 weight=1;
server 47.113.82.141:8082 weight=2;
}
3、ip_hash
每個請求按照ip的hash結果分配,每一個客戶端的請求會固定分配到同一個目標服務器處理,可
以解決session
問題。
upstream riemannServer{
ip_hash;
server 47.113.82.141:8080;
server 47.113.82.141:8082;
}
六、Nginx應用場景之動靜分離
動靜分離就是講動態資源和靜態資源的請求處理分配到不同的服務器上,比較經典的組合就是 Nginx+Tomcat
架構(Nginx
處理靜態資源請求,Tomcat
處理動態資源請求),那麼其實之前的講解 中,Nginx
反向代理目標服務器Tomcat
,我們能看到目標服務器ROOT
項目的index.jsp
,這本身就是 Tomcat
在處理動態資源請求了。
所以,我們只需要配置靜態資源訪問即可。
動靜分離需求
主要是靜態資源的訪問,因爲我們之前Nginx
反向代理到Tomcat
能夠看到Tomcat ROOT
項目的index.jsp
頁面,這本身就是一個動態資源的請求過程。
我們希望在Nginx
服務器上部署靜態資源,然後瀏覽器請求http://47.113.82.141/9003/static/abc.html
,Nginx
直接讀取的本地靜態資源。
Nginx配置
七、Nginx底層進程機制剖析
Nginx
啓動後,以daemon
多進程方式在後臺運行,包括一個Master
進程和多個Worker
進程,Master
進程是領導,是老大,Worker
進程是幹活的小弟。
-
master進程
主要是管理
worker
進程,比如:
接收外界信號向各worker
進程發送信號(./nginx -s reload
)
監控worker
進程的運行狀態,當worker
進程異常退出後Master
進程會自動重新啓動新的worker
進程等 -
worker進程
worker
進程具體處理網絡請求。多個worker
進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。一個請求,只可能在一個worker
進程中處理,一個worker
進程, 不可能處理其它進程的請求。worker
進程的個數是可以設置的,一般設置與機器cpu
核數一致。
1、Nginx進程模型示意圖如下
2、以 ./nginx -s reload
來說明nginx信號處理這部分
master
進程對配置文件進行語法檢查- 嘗試配置(比如修改了監聽端口,那就嘗試分配新的監聽端口)
- 嘗試成功則使用新的配置,新建
worker
進程 - 新建成功,給舊的
worker
進程發送關閉消息 - 舊的worker進程收到信號會繼續服務,直到把當前進程接收到的請求處理完畢後關閉
所以reload
之後worker
進程pid
是發生了變化的
3、worker進程處理請求部分的說明
例如,我們監聽9003端口,一個請求到來時,如果有多個worker進程,那麼每個worker進程都有
可能處理這個鏈接。
master
進程創建之後,會建立好需要監聽的的socket
,然後從master
進程再fork
出多個
worker
進程。所以,所有worker
進程的監聽描述符listened在新連接到來時都變得可讀。nginx
使用互斥鎖來保證只有一個worker
進程能夠處理請求,拿到互斥鎖的那個進程註冊listenfd
讀事件,在讀事件裏調用accept
接受該連接,然後解析、處理、返回客戶端。
4、nginx多進程模型好處
- 每個
worker
進程都是獨立的,不需要加鎖,節省開銷 - 每個
worker
進程都是獨立的,互不影響,一個異常結束,其他的照樣能提供服務 - 多進程模型爲
reload
熱部署機制提供了支撐