Nginx應用全入門
基礎回顧
Nginx是什麼?
Nginx是一個高效能的HTTP和反向代理web伺服器,特點是記憶體少,併發能力強
Nginx能做什麼
- Http伺服器(Web伺服器)
- 反向代理伺服器
- 負載均衡
- 動靜分離
Nginx主要命令:
./nginx 啟動nginx
./nginx -s stop 終止nginx
./nginx -s reload 重新啟動nginx
安裝nginx
- 到官網下載nginx
- 安裝依賴
yum -y install gcc
yum -y install gcc-c++
yum install -y zlib-devel
yum -y install openssl openssl-devel
./configure --prefix=/usr/local/nginx
make
make install
然後可以發現/usr/local/nginx目錄。
Nginx核心配置
Nginx的核⼼配置⽂件conf/nginx.conf包含三塊內容:全域性塊、events塊、http塊
- 全域性塊
從配置⽂件開始到events塊之間的內容,此處的配置影響nginx伺服器整體的運⾏,⽐如worker程式的數量、錯誤⽇志的位置等
- events塊
events塊主要影響nginx伺服器與⽤戶的⽹絡連線,⽐如worker_connections 1024,表示每個workderprocess⽀持的最⼤連線數為1024
- http塊
http塊是配置最頻繁的部分,虛擬主機的配置,監聽端⼝的配置,請求轉發、反向代理、負載均衡等
應用場景之反向代理
反向代理的概念:
反向代理伺服器位於使用者與目標伺服器之間,但是對於使用者而言,反向代理伺服器就相當於目標伺服器,即使用者直接訪問反向代理伺服器就可以獲得目標伺服器的資源。同時,使用者不需要知道目標伺服器的地址,也無須在使用者端作任何設定。反向代理伺服器通常可用來作為Web加速,即使用反向代理作為Web伺服器的前置機來降低網路和伺服器的負載,提高訪問效率。
- 需求一:訪問nginx,代理到tomcat目標伺服器上,nginx埠設定為9003
- 修改nginx.conf
- 重啟 sbin/nginx -s reload
效果:
- 需求二:訪問http://192.168.56.115:9003/abc 時代理到tomcat,訪問http://192.168.56.115:9003/def時訪問到baidu
這裡主要是多location的使用。location語法如下:
location [=||*|^~] /uri/ { … }
在nginx配置檔案中,location主要有這幾種形式
- 正則匹配 location ~/lagou {}
- 不區分大小寫的正則匹配 location ~*/lagou {}
- 匹配路徑字首 location ^~/lagou {}
- 精確匹配 location =/lagou {}
- 普通路徑字首匹配 lacation /lagou {}
優先順序:精確匹配> 匹配路徑字首>不區分大小寫的正則匹配>正則匹配 >普通路徑字首匹配
應用場景之負載均衡
當客戶端瀏覽器訪問到nginx時,使用nginx作為負載均衡器,將請求分配到兩個tomcat:127.0.0.1:8080、和127.0.0.1:8082
- 輪詢配置
預設策略,每個請求按時間順序逐一分配到不同的伺服器,如果某一個伺服器下線,能自動剔除
- weight
weight代表權重,預設每一個負載的伺服器都為1,權重越高分配的請求就越多
- ip_hash
每個請求按照ip的hash結果分配,每一個客戶端的請求會固定分配到同一個目標伺服器處理,可以解決session問題
應用場景之動靜分離
動靜分離就是講動態資源和靜態資源的請求處理分配到不同的伺服器上,⽐較經典的組合就是Nginx+Tomcat架構(Nginx處理靜態資源請求,Tomcat處理動態資源請求),那麼其實之前的講解中,Nginx反向代理⽬標伺服器Tomcat,我們能看到⽬標伺服器ROOT項⽬的index.jsp,這本身就是Tomcat在處理動態資源請求了。
- 修改nginx.conf配置
location /static {
root staticData;
}
- 將靜態資源放到配置的目錄下
在nginx目錄下建立/staticData/static目錄,將靜態檔案放進去
- 訪問
http://192.168.56.115:9003/static/index.html
http://192.168.56.115:9003/static/1.jpg
Ngnix底層程式機制刨析
Nginx啟動後,以daemon多程式方式在後臺執行,包括一個Master程式和多個Worker程式。
- master程式
主要是管理worker程式,比如
- 接收外交訊號向各woker程式傳送
- 監控woker程式的執行狀態,當worker程式異常退出後Master程式會自動重新啟動新的worker程式。
- worker程式
woker程式具體處理網路請求。多個worker程式之間是對等的,各個程式之間是獨立的。一個程式只能在一個worker程式中處理,worker程式的個數是可以設定的,一般設定與機器的cpu核數一致。
例如:我們監聽9003埠,一個請求到來時,如果有多個worker程式,那麼每個worker程式都有可能處理這個連結
- master程式建立之後,會建立需要監聽的socker,然後從master程式在fork出多個worker程式。所以,所有worker程式的監聽描述符在新連線到來時都變得可讀。
- nginx使用互斥鎖保證只有一個worker程式能夠處理請求。
流程說明:
以 ./nginx -s reload 來說明nginx訊號處理這部分的流程
1)master程式對配置⽂件進⾏語法檢查
2)嘗試配置(⽐如修改了監聽端⼝,那就嘗試分配新的監聽端⼝)
3)嘗試成功則使⽤新的配置,新建worker程式
4)新建成功,給舊的worker程式傳送關閉訊息
5)舊的worker程式收到訊號會繼續服務,直到把當前程式接收到的請求處理完畢後關閉
所以reload之後worker程式pid是發⽣了變化的
Nginx多程式模型的好處:
- 每個worker程式是獨立的,不需要加鎖,節省開銷
- 每個worker程式是獨立的,互不影響,一個異常了,其他的依然可以提供服務
- 多程式模型為reload熱部署提供了支撐