[TOC] #### 1. 簡(jiǎn)介 --- nginx 是目前最流行的 web 服務(wù)器軟件,也是目前互聯(lián)網(wǎng)公司和網(wǎng)站的首選 nginx 發(fā)行版比較多,常用版本有兩大陣營(yíng),我們平時(shí)使用最多的是開(kāi)源版,本文使用的也是開(kāi)源版 + nginx 開(kāi)源版:<https://nginx.org> + nginx plus 商業(yè)版:<https://nginx.com> #### 2. 安裝 --- nginx 有多種安裝方式: 方式一:使用包管理器,這種方式比較簡(jiǎn)單,只需要一個(gè) install 命令即可 [點(diǎn)擊查看 CentOS 7 使用 Yum 安裝 Nginx](http://beautifulforever.com.cn/index/645.html) ```bash # MacOS brew install nginx # Windows scoop install nginx ``` 方式二:使用源碼進(jìn)行編譯安裝 [點(diǎn)擊查看 CentOS 7 編譯安裝 Nginx](http://beautifulforever.com.cn/index/626.html) nginx 是使用 c 語(yǔ)言開(kāi)發(fā)的,那么也就可以像其他 c 語(yǔ)言項(xiàng)目一樣,下載 nginx 的源碼到自己的服務(wù)器上,然后執(zhí)行預(yù)編譯、編譯和安裝,這種方式比較靈活,可以自定義各種配置參數(shù),適合于一些特殊的場(chǎng)景 這種方式也是比較麻煩的,因?yàn)榫幾g安裝的過(guò)程,可能會(huì)遇到各種各樣的問(wèn)題,需要有一定的排查和解決問(wèn)題的能力 ```bash ./configure --prefix=/usr/local/nginx ``` 方式三:使用 Docker 安裝,使用 docker 鏡像來(lái)安裝和運(yùn)行 nginx 這種方式也是比較簡(jiǎn)單的,只需要執(zhí)行幾個(gè) docker 命令就可以了,想要學(xué)習(xí)和體驗(yàn)已經(jīng)足夠滿(mǎn)足了 ```bash docker pull nginx ``` #### 3. 服務(wù)啟停 --- nginx 安裝完成之后就可以來(lái)啟動(dòng)服務(wù)了,在 nginx 安裝目錄下的 sbin 目錄下運(yùn)行以下命令 回車(chē)之后沒(méi)有任何提示消息的話(huà),就表示啟動(dòng)成功了,這是 linux 系統(tǒng)的一個(gè)設(shè)計(jì)思想,沒(méi)有消息就是最好的消息 如果啟動(dòng)失敗的話(huà)會(huì)有提示,那么就需要根據(jù)提示信息來(lái)排查和解決問(wèn)題 ```bash ./nginx ``` nginx 的服務(wù)啟動(dòng)之后,會(huì)作為一個(gè)后臺(tái)進(jìn)程一直運(yùn)行,我們運(yùn)行下面命令查看 nginx 進(jìn)程 ```bash ps -ef | grep nginx ``` 這里只需要關(guān)注前面兩個(gè)進(jìn)程就可以了,一個(gè)是 master 進(jìn)程,一個(gè)是 worker 進(jìn)程 ![](https://img.itqaq.com/art/content/5188b5e564179e612b37073bfeed3273.png) 稍微解釋一下 nginx 的進(jìn)程模型,這里的 master 進(jìn)程就是 nginx 的主進(jìn)程 它主要負(fù)責(zé)讀取和驗(yàn)證配置文件以及管理 worker 進(jìn)程,worker 進(jìn)程就是 nginx 的工作進(jìn)程,負(fù)責(zé)處理實(shí)際的請(qǐng)求,master 進(jìn)程只有一個(gè),而 worker 進(jìn)行可以有多個(gè) master 進(jìn)程和 worker 進(jìn)程之間的關(guān)系就像是老板和員工的關(guān)系一樣,老板負(fù)責(zé)管理員工,并且將工作分配給員工,員工負(fù)責(zé)完成具體的工作,worker 進(jìn)程的數(shù)量可以通過(guò)配置文件來(lái)調(diào)整 上圖中的第二列就是 PID,也就是進(jìn)程 ID,PID 是 Linux 系統(tǒng)中每一個(gè)進(jìn)程的唯一標(biāo)識(shí) ![](https://img.itqaq.com/art/content/46e23b4e6e715d098217bee483174bd3.gif) 還可以使用 lsof 命令來(lái)查看一個(gè)端口占用情況 ```bash lsof -i:80 ``` 有些系統(tǒng)沒(méi)有自帶 lsof 命令,需要手動(dòng)安裝【mac 已經(jīng)自帶,無(wú)需自行安裝】 ```bash # centos yum install lsof -y ``` 我們可以看到 80 端口正被 nginx 的兩個(gè)進(jìn)行占用著 這兩個(gè)進(jìn)程的 PID 就是上面我們看到的 nginx 的進(jìn)程 PID,表示 nginx 正在監(jiān)聽(tīng) 80 端口 ![](https://img.itqaq.com/art/content/ac40fb49627db8d7931253d9d31c2eb5.png) nginx 服務(wù)啟動(dòng)之后,我們可以通過(guò) `./nginx -s 參數(shù)` 來(lái)控制 nginx 的停止或重啟 ```bash ./nginx -s quit # 優(yōu)雅停止 ./nginx -s stop # 立即停止 ./nginx -s reload # 重載配置文件 ``` #### 4. 目錄結(jié)構(gòu) --- 在使用 nginx 之前,我們先對(duì)安裝好的 nginx 目錄文件進(jìn)行一個(gè)分析,可以使用一個(gè)工具 tree,使用該命令可以方便的查看文件目錄結(jié)構(gòu),要使用該命令需要先進(jìn)行安裝,運(yùn)行以下命令即可 ```bash yum install tree -y ``` ##### 1. 目錄概覽 nginx 一般都是安裝在 `/usr/local/nginx` 目錄,本文默認(rèn)您將 nginx 安裝到此目錄下 ```bash ./configure --prefix=/usr/local/nginx ``` nginx 安裝完成后,在其安裝目錄下默認(rèn)有下面四個(gè)目錄 ``` ├── conf # 配置文件存放目錄 ├── html # 默認(rèn)站點(diǎn)目錄 ├── logs # 日志文件存放目錄 ├── sbin # nginx 主程序文件存放目錄 ``` 如果你的目錄下多了好幾個(gè)以 `_temp` 為后綴的目錄,無(wú)需關(guān)注,這幾個(gè)目錄都是 nginx 運(yùn)行時(shí)產(chǎn)生的臨時(shí)文件 ```bash ls /usr/local/nginx ``` ![](https://img.itqaq.com/art/content/c07587cc8185371b83b92785a7cf525d.png) nginx 目錄結(jié)構(gòu)一覽圖 ![](https://img.itqaq.com/art/content/27b836d0b4136568a7e413d0080e817a.png) ##### 2. conf 目錄 --- conf:nginx 配置文件存放目錄 可以將默認(rèn)的配置文件分為三大類(lèi):cgi 相關(guān)配置文件 CGI(Common Gateway Interface):通用網(wǎng)關(guān)接口,主要解決的問(wèn)題是從客戶(hù)端發(fā)送一個(gè)請(qǐng)求和數(shù)據(jù),服務(wù)端獲取到請(qǐng)求和數(shù)據(jù)后可以調(diào)用 CGI 程序處理及相應(yīng)結(jié)果給客戶(hù)端的一種標(biāo)準(zhǔn)規(guī)范 ``` ├── fastcgi.conf # fastcgi 配置文件 ├── fastcgi.conf.default # fastcgi.conf 的備份文件 ├── fastcgi_params # fastcgi 參數(shù)配置 ├── fastcgi_params.default # fastcgi_params 的備份文件 ├── scgi_params # scgi 參數(shù)配置 ├── scgi_params.default # scgi_params 的備份文件 ├── uwsgi_params # uwsgi 參數(shù)配置 ├── uwsgi_params.default # uwsgi_params 的備份文件 ├── koi-utf ├── koi-win ├── win-utf ├── mime.types ├── mime.types.default ├── nginx.conf ├── nginx.conf.default ``` nginx.conf 為主配置文件,主配置文件會(huì)引用其他配置文件 ![](https://img.itqaq.com/art/content/48903cd0f87afd9810be917067f0eadf.png) 當(dāng)修改配置文件后,運(yùn)行以下命令來(lái)檢查配置文件的內(nèi)容是否正確,當(dāng)有錯(cuò)誤時(shí),會(huì)提示錯(cuò)誤的位置和原因 ```bash ./nginx -t ``` nginx 的配置文件修改后,都是需要重新加載一下才會(huì)生效的 ```bash ./nginx -s reload ``` 在主配置文件 nginx.conf 中可以修改 worker 進(jìn)程的數(shù)量 ``` # worker 進(jìn)程數(shù)量默認(rèn)只有一個(gè) worker_processes 1; ``` 將 worker 進(jìn)程數(shù)量設(shè)置為 3 個(gè),重載 nginx 配置后,查看進(jìn)程就能看到生效了 ``` worker_processes 3; ``` ![](https://img.itqaq.com/art/content/fc2a4351b07c27d01b9ecd2df9885b9b.png) 一般來(lái)說(shuō),worker 進(jìn)程的數(shù)量保持和服務(wù)器 CPU 內(nèi)核的數(shù)量相同是比較合適的,也可以設(shè)置為 `auto`,這樣 nginx 就會(huì)根據(jù)內(nèi)核的數(shù)量來(lái)自動(dòng)設(shè)置 worker 進(jìn)程的數(shù)量 ``` worker_processes auto; ``` ##### 3. logs 目錄 --- logs 目錄用來(lái)存放 nginx 日志文件和主進(jìn)程 pid,日志文件比如:訪問(wèn)日志 (access.log) 和錯(cuò)誤日志 (error.log) ![](https://img.itqaq.com/art/content/92a0e09c1b6b64e4c1508215e070a2e6.png) nginx.pid 用來(lái)記錄 nginx 主進(jìn)程的 pid(當(dāng) nginx 服務(wù)啟動(dòng)后才會(huì)該文件) ![](https://img.itqaq.com/art/content/947d243d5029893d07bf9aae962d41be.png) ##### 4. sbin 目錄 --- sbin 目錄用于存放 nginx 主進(jìn)程文件,根據(jù)它可以啟動(dòng)、停止 nginx 服務(wù)以及重載 nginx 配置 ![](https://img.itqaq.com/art/content/fded7829bd0705379d2d2161130cf750.png) #### 5. 運(yùn)行原理 --- **a. 基本運(yùn)行原理** nginx 的高性能,其實(shí)和它的架構(gòu)模式有關(guān),nginx 默認(rèn)采用的是多進(jìn)程的方式來(lái)工作的 當(dāng)通過(guò) nginx 主進(jìn)程文件啟動(dòng) nginx 服務(wù)時(shí),會(huì)開(kāi)啟主進(jìn)程,然后主進(jìn)程就會(huì)讀取并校驗(yàn)配置文件(nginx.conf) 當(dāng)配置文件沒(méi)有錯(cuò)誤時(shí),會(huì)開(kāi)啟多個(gè)子進(jìn)程,用于接受并響應(yīng)請(qǐng)求 當(dāng)有網(wǎng)絡(luò)請(qǐng)求發(fā)送時(shí),子進(jìn)程就會(huì)接受請(qǐng)求,然后解析請(qǐng)求,讀取配置文件,然后響應(yīng)請(qǐng)求 **b. 總結(jié)** nginx 服務(wù)啟動(dòng)會(huì)運(yùn)行一個(gè)主進(jìn)程,多個(gè)子進(jìn)程,主進(jìn)程負(fù)責(zé)協(xié)調(diào)子進(jìn)程 ![](https://img.itqaq.com/art/content/e83f78fea2d9ce603ff6b0eb6b567689.png) 當(dāng)配置文件更改了,我們會(huì)執(zhí)行以下命令重新加載配置文件 ```bash ./nginx -s reload ``` 該命令會(huì)將子進(jìn)程殺掉,在殺掉之前會(huì)留有時(shí)間完成之前用戶(hù)的請(qǐng)求,并且告訴子進(jìn)程不允許再接受新的請(qǐng)求了 當(dāng)子進(jìn)程把所有之前的請(qǐng)求完成后,子進(jìn)程就會(huì)被殺掉了,新的子進(jìn)程去讀新的配置文件 驗(yàn)證上面的話(huà),如下圖所示,reload 之后,子進(jìn)程的 pid 變了,主進(jìn)程并沒(méi)有變 ``` ps -ef | grep nginx /usr/local/nginx/sbin/nginx -s reload ``` ![](https://img.itqaq.com/art/content/748b76f2377b6c33b26327b9ee1d4615.png) nginx 基本運(yùn)行原理如下圖所示 ![](https://img.itqaq.com/art/content/1b62c3366fef45d71e19333aa2dfd5b8.png)