Nginx工作原理及基本使用
Nginx工作原理
Nginx默認采用多進程工作方式,Nginx啟動后,會運行一個master進程和多個worker進程。其中master充當整個進程組與用戶的交互接口,同時對進程進行監護,管理worker進程來實現重啟服務、平滑升級、更換日志文件、配置文件實時生效等功能。worker用來處理基本的網絡事件,worker之間是平等的,他們共同競爭來處理來自客戶端的請求。
Nginx主要由一個master主進程和多個worker進程
- master主進程主要是管理worker進程,對網絡事件進行收集和分發:
1.接收來自外界的信號
2.向各worker進程發送信號
3.監控worker進程的運行狀態,當worker進程退出后(異常情況下),會自動重新啟動新的worker進程 - nginx用一個獨立的worker進程來處理一個請求,一個worker進程可以處理多個請求:
- 當一個worker進程在accept這個連接之后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接。
- 一個請求,完全由worker進程來處理,而且只在一個worker進程中處理。采用這種方式的好處:
- 節省鎖帶來的開銷。對于每個worker進程來說,獨立的進程,不需要加鎖,所以省掉了鎖帶來的開銷,同時在編程以及問題查上時,也會方便很多
- 獨立進程,減少風險。
- 采用獨立的進程,可以讓互相之間不會影響,一個進程退出后,其它進程還在工作,服務不會中斷,master進程則很快重新啟動新的worker進程。
- 在一次請求里無需進程切換
- Nginx的IO通常使用epoll,epoll函數使用了I/O復用模型。與I/O阻塞模型比較,I/O復用模型的優勢在于可以同時等待多個(而不只是一個)套接字描述符就緒。Nginx的epoll工作流程如下:
-
- master進程先建好需要listen的socket后,然后再fork出多個woker進程,這樣每個work進程都可以去accept這個socket
- 當一個client連接到來時,所有accept的work進程都會受到通知,但只有一個進程可以accept成功,其它的則會accept失敗,Nginx提供了一把共享鎖來保證同一時刻只有一個work進程在accept連接,從而解決驚群問題
- 當一個worker進程accept這個連接后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完成的請求就結束了
- Nginx最大連接數:
-
- worker_processes:worker角色的進程個數
- worker_connections:每一個worker進程能并發處理(發起)的最大連接數(包含所有連接數)
- Nginx作為http服務器的時候:max_clients = worker_processes * worker_connections
- Nginx作為反向代理服務器的時候:max_clients = worker_processes * worker_connections/4 (/4原因:因為瀏覽器默認會開啟2個連接到nginx
server,而且nginx還會為每個連接使用fds(file
descriptor文件描述符)從連接池建立connection到upstream后端。)
- Nginx主要通過nginx.conf文件進行配置使用。在nginx.conf文件中主要分為:
-
- 全局塊:一些全局的屬性,在運行時與具體業務功能(比如http服務或者email服務代理)無關的一些參數,比如工作進程數,運行的身份等
- event塊:參考事件模型,單個進程最大連接數等
- http塊:設定http服務器
- server塊:配置虛擬主機
- location塊:配置請求路由及頁面的處理情況等
location配置:
虛擬主機配置實戰
虛擬主機概念
所謂虛擬主機,在Web服務里就是一個獨立的網站站點(www.baidu.org),這個站點對應獨立的域名(也可能是IP或端口),具有獨立的程序及資源目錄,可以獨立地對外提供服務供用戶訪問。
這個獨立的站點在配置里是由一定格式的標簽段標記,對于Apache軟件來說,一個虛擬主機的標簽段通常被包含在http塊中。
虛擬主機類型
常見的虛擬主機類型有如下幾種。
基于域名的虛擬主機
所謂基于域名的虛擬主機,意思就是通過不同的域名區分不同的虛擬主機,基于域名的虛擬主機是企業應用最廣的虛擬主機類型,幾乎所有對外提供服務的網站都是使用基于域名的虛擬主機,例如:www.etiantian.org
基于端口的虛擬主機
同理,所謂基于端口的虛擬主機,意思就是通過不同的端口來區分不同的虛擬主機,此類虛擬主機對應的企業應用主要為公司內部的網站,例如:一些不希望直接對外提供用戶訪問的網站后臺等,訪問基于端口的虛擬主機地址里要帶有端口,例如:http://www.baidu.com:80
基于IP的虛擬主機
同理,所謂基于IP的虛擬主機,意思就是通過不同的IP區分不同的虛擬主機,此類虛擬主機對應的企業應用非常少見,一般不同業務需要使用多IP的場景都會在負載均衡器上進行VIP綁定,而不是在Web上通過綁定IP區分不同的虛擬機。
三種虛擬主機類型均可獨立使用,也可以互相混合一起使用,同學們應把基于域名的虛擬主機類型當作重點來學習掌握,其他的兩個類型了解即可。
基于域名的虛擬主機配置實戰
說明:本節內容再生產場景中是最常用到的,因此,同學們要優先并且熟練掌握。
修改配置文件Nginx.conf,編輯活自己重寫
編輯完配置文件后,我們需要檢查語法
[root@localhost conf]# /application/nginx/sbin/nginx -t nginx: the configuration file /application/nginx-1.10.2//conf/nginx.conf syntax is ok nginx: configuration file /application/nginx-1.10.2//conf/nginx.conf test is successful然后由于web的存放路徑是相對路徑,因此需要在html/下創建相應的目錄
如圖:
接下來繼續增加一個域名的網站:
給第二個網站添加網頁文件,同第一個網頁一樣。
這是因為通過IP地址來訪問的話,nginx并不知道你想要訪問哪個站點,因此,他默認你是要訪問他配置文件里的第一個站點,也就是www.zxy.com
通過修改hosts映射我們可以訪問不同的站點。
總結
以上是生活随笔為你收集整理的Nginx工作原理及基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#数组的合并拆分
- 下一篇: Nginx 架构原理