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熱部署提供了支撐