Nginx應用場景配置
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
效果:
- 需求二:訪問//192.168.56.115:9003/abc 時代理到tomcat,訪問//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目錄,將靜態文件放進去
- 訪問
//192.168.56.115:9003/static/index.html
//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熱部署提供了支撐