运行中的Nginx进程间的关系
第2章 Nginx的配置
Nginx擁有大量官方發(fā)布的模塊和第三方模塊,這些已有的模塊可以幫助我們實(shí)現(xiàn)Web服務(wù)器上很多的功能。使用這些模塊時(shí),僅僅需要增加、修改一些配置項(xiàng)即可。因此,本章的目的是熟悉Nginx的配置文件,包括配置文件的語法格式、運(yùn)行所有Nginx服務(wù)必須具備的基礎(chǔ)配置以及使用HTTP核心模塊配置靜態(tài)Web服務(wù)器的方法,最后還會介紹反向代理服務(wù)器。
通過本章的學(xué)習(xí),讀者可以:熟練地配置一個(gè)靜態(tài)Web服務(wù)器;對影響Web服務(wù)器性能的各個(gè)配置項(xiàng)有深入的理解;對配置語法有全面的了解。通過互聯(lián)網(wǎng)或其他途徑得到任意模塊的配置說明,然后可通過修改nginx.conf文件來使用這些模塊的功能。
2.1 運(yùn)行中的Nginx進(jìn)程間的關(guān)系
在正式提供服務(wù)的產(chǎn)品環(huán)境下,部署Nginx時(shí)都是使用一個(gè)master進(jìn)程來管理多個(gè)worker進(jìn)程,一般情況下,worker進(jìn)程的數(shù)量與服務(wù)器上的CPU核心數(shù)相等。每一個(gè)worker進(jìn)程都是繁忙的,它們在真正地提供互聯(lián)網(wǎng)服務(wù),master進(jìn)程則很“清閑”,只負(fù)責(zé)監(jiān)控管理worker進(jìn)程。worker進(jìn)程之間通過共享內(nèi)存、原子操作等一些進(jìn)程間通信機(jī)制來實(shí)現(xiàn)負(fù)載均衡等功能(第9章將會介紹負(fù)載均衡機(jī)制,第14章將會介紹負(fù)載均衡鎖的實(shí)現(xiàn))。
部署后Nginx進(jìn)程間的關(guān)系如圖2-1所示。
Nginx是支持單進(jìn)程(master進(jìn)程)提供服務(wù)的,那么為什么產(chǎn)品環(huán)境下要按照master-worker方式配置同時(shí)啟動(dòng)多個(gè)進(jìn)程呢?這樣做的好處主要有以下兩點(diǎn):
由于master進(jìn)程不會對用戶請求提供服務(wù),只用于管理真正提供服務(wù)的worker進(jìn)程,所以master進(jìn)程可以是唯一的,它僅專注于自己的純管理工作,為管理員提供命令行服務(wù),包括諸如啟動(dòng)服務(wù)、停止服務(wù)、重載配置文件、平滑升級程序等。master進(jìn)程需要擁有較大的權(quán)限,例如,通常會利用root用戶啟動(dòng)master進(jìn)程。worker進(jìn)程的權(quán)限要小于或等于master進(jìn)程,這樣master進(jìn)程才可以完全地管理worker進(jìn)程。當(dāng)任意一個(gè)worker進(jìn)程出現(xiàn)錯(cuò)誤從而導(dǎo)致coredump時(shí),master進(jìn)程會立刻啟動(dòng)新的worker進(jìn)程繼續(xù)服務(wù)。
多個(gè)worker進(jìn)程處理互聯(lián)網(wǎng)請求不但可以提高服務(wù)的健壯性(一個(gè)worker進(jìn)程出錯(cuò)后,其他worker進(jìn)程仍然可以正常提供服務(wù)),最重要的是,這樣可以充分利用現(xiàn)在常見的SMP多核架構(gòu),從而實(shí)現(xiàn)微觀上真正的多核并發(fā)處理。因此,用一個(gè)進(jìn)程(master進(jìn)程)來處理互聯(lián)網(wǎng)請求肯定是不合適的。另外,為什么要把worker進(jìn)程數(shù)量設(shè)置得與CPU核心數(shù)量一致呢?這正是Nginx與Apache服務(wù)器的不同之處。在Apache上每個(gè)進(jìn)程在一個(gè)時(shí)刻只處理一個(gè)請求,因此,如果希望Web服務(wù)器擁有并發(fā)處理的請求數(shù)更多,就要把Apache的進(jìn)程或線程數(shù)設(shè)置得更多,通常會達(dá)到一臺服務(wù)器擁有幾百個(gè)工作進(jìn)程,這樣大量的進(jìn)程間切換將帶來無謂的系統(tǒng)資源消耗。而Nginx則不然,一個(gè)worker進(jìn)程可以同時(shí)處理的請求數(shù)只受限于內(nèi)存大小,而且在架構(gòu)設(shè)計(jì)上,不同的worker進(jìn)程之間處理并發(fā)請求時(shí)幾乎沒有同步鎖的限制,worker進(jìn)程通常不會進(jìn)入睡眠狀態(tài),因此,當(dāng)Nginx上的進(jìn)程數(shù)與CPU核心數(shù)相等時(shí)(最好每一個(gè)worker進(jìn)程都綁定特定的CPU核心),進(jìn)程間切換的代價(jià)是最小的。
舉例來說,如果產(chǎn)品中的服務(wù)器CPU核心數(shù)為8,那么就需要配置8個(gè)worker進(jìn)程(見圖2-2)。
如果對路徑部分都使用默認(rèn)配置,那么Nginx運(yùn)行目錄為/usr/local/nginx,其目錄結(jié)構(gòu)如下。
?
總結(jié)
以上是生活随笔為你收集整理的运行中的Nginx进程间的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NGINX 进程通信机制
- 下一篇: 深入理解Nginx 模块开发与架构解析-