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