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