https://www.codesheep.cn/2018/06/26/%E4%BB%8E%E4%B8%80%E4%BB%BD%E9%85%8D%E7%BD%AE%E6%B8%85%E5%8D%95%E8%AF%A6%E8%A7%A3Nginx%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE/ 從一份配置清單詳解Nginx伺服器配置
《Nginx高性能Web伺服器詳解》
檢測配置檔案是否有文法錯誤:nginx -t
檢視系統允許程序打開的檔案描述符個數:cat /proc/sys/fs/file-max
https://www.codesheep.cn/2018/05/25/Nginx%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E7%AE%B1%E4%BD%93%E9%AA%8C/ Nginx伺服器開箱體驗
Nginx配置檔案的整體結構
nginx配置檔案結構
從圖中可以看出主要包含以下幾大部分内容:
1. 全局塊
該部配置設定置主要影響Nginx全局,通常包括下面幾個部分:
- 配置運作Nginx伺服器使用者(組)
- worker process數
- Nginx程序PID存放路徑
- 錯誤日志的存放路徑
- 配置檔案的引入
2. events塊
該部配置設定置主要影響Nginx伺服器與使用者的網絡連接配接,主要包括:
- 設定網絡連接配接的序列化
- 是否允許同時接收多個網絡連接配接
- 事件驅動模型的選擇
- 最大連接配接數的配置
3. http塊
- 定義MIMI-Type
- 自定義服務日志
- 允許sendfile方式傳輸檔案
- 連接配接逾時時間
- 單連接配接請求數上限
4. server塊
- 配置網絡監聽
- 基于名稱的虛拟主機配置
- 基于IP的虛拟主機配置
5. location塊
- location配置
- 請求根目錄配置
- 更改location的URI
- 網站預設首頁配置
一份配置清單例析
筆者按照文章:《Nginx伺服器開箱體驗》 中的實驗,給出了一份簡要的清單配置舉例:
一份配置清單例析
配置代碼如下:
| |
接下來就來詳細剖析以下配置檔案中各個指令的含義⬇️
配置運作Nginx伺服器使用者(組)
指令格式:
user user [group];
- user:指定可以運作Nginx伺服器的使用者
- group:可選項,可以運作Nginx伺服器的使用者組
如果user指令不配置或者配置為
user nobody nobody
,則預設所有使用者都可以啟動Nginx程序
worker process數配置
Nginx伺服器實作并發處理服務的關鍵,指令格式:
worker_processes number | auto;
- number:Nginx程序最多可以産生的worker process數
- auto:Nginx程序将自動檢測
按照上文中的配置清單的實驗,我們給worker_processes配置的數目是:3,啟動Nginx伺服器後,我們可以背景看一下主機上的Nginx程序情況:
| |
很明顯,了解
worker_processes
這個指令的含義就很容易了
ps -aux | grep nginx
Nginx程序PID存放路徑
Nginx程序是作為系統守護程序在運作,需要在某檔案中儲存目前運作程式的主程序号,Nginx支援該儲存檔案路徑的自定義
指令格式:
pid file;
- file:指定存放路徑和檔案名稱
- 如果不指定預設置于路徑
logs/nginx.pid
錯誤日志的存放路徑
指定格式:
error_log file | stderr;
- file:日志輸出到某個檔案file
- stderr:日志輸出到标準錯誤輸出
配置檔案的引入
指令格式:
include file;
- 該指令主要用于将其他的Nginx配置或者第三方子產品的配置引用到目前的主配置檔案中
設定網絡連接配接的序列化
指令格式:
accept_mutex on | off;
- 該指令預設為on狀态,表示會對多個Nginx程序接收連接配接進行序列化,防止多個程序對連接配接的争搶。
說到該指令,首先得闡述一下什麼是所謂的 “驚群問題”,可以參考 WIKI百科的解釋。就Nginx的場景來解釋的話大緻的意思就是:當一個新網絡連接配接來到時,多個worker程序會被同時喚醒,但僅僅隻有一個程序可以真正獲得連接配接并處理之。如果每次喚醒的程序數目過多的話,其實是會影響一部分性能的。
是以在這裡,如果accept_mutex on,那麼多個worker将是以串行方式來處理,其中有一個worker會被喚醒;反之若accept_mutex off,那麼所有的worker都會被喚醒,不過隻有一個worker能擷取新連接配接,其它的worker會重新進入休眠狀态
這個值的開關與否其實是要和具體場景挂鈎的。
是否允許同時接收多個網絡連接配接
指令格式:
multi_accept on | off;
- 該指令預設為off狀态,意指每個worker process 一次隻能接收一個新到達的網絡連接配接。若想讓每個Nginx的worker process都有能力同時接收多個網絡連接配接,則需要開啟此配置
事件驅動模型的選擇
指令格式:
use model;
- model模型可選擇項包括:select、poll、kqueue、epoll、rtsig等……
最大連接配接數的配置
指令格式:
worker_connections number;
- number預設值為512,表示允許每一個worker process可以同時開啟的最大連接配接數
定義MIME-Type
指令格式:
| |
- MIME-Type指的是網絡資源的媒體類型,也即前端請求的資源類型
- include指令将mime.types檔案包含進來
cat mime.types
來檢視mime.types檔案内容,我們發現其就是一個types結構,裡面包含了各種浏覽器能夠識别的MIME類型以及對應類型的檔案字尾名字,如下所示:
cat mime.types
自定義服務日志
指令格式:
| |
- path:自定義服務日志的路徑 + 名稱
- format:可選項,自定義服務日志的字元串格式。其也可以使用
定義的格式log_format
允許sendfile方式傳輸檔案
指令格式:
| |
- 前者用于開啟或關閉使用sendfile()傳輸檔案,預設off
- 後者指令若size>0,則Nginx程序的每個worker process每次調用sendfile()傳輸的資料了最大不能超出此值;若size=0則表示不限制。預設值為0
連接配接逾時時間配置
指令格式:
keepalive_timeout timeout [header_timeout];
- timeout 表示server端對連接配接的保持時間,預設75秒
- header_timeout 為可選項,表示在應答封包頭部的 Keep-Alive 域設定逾時時間:“Keep-Alive : timeout = header_timeout”
單連接配接請求數上限
指令格式:
keepalive_requests number;
- 該指令用于限制使用者通過某一個連接配接向Nginx伺服器發起請求的次數
配置網絡監聽
指令格式:
- 第一種:配置監聽的IP位址:
listen IP[:PORT];
- 第二種:配置監聽的端口:
listen PORT;
實際舉例:
| |
基于名稱和IP的虛拟主機配置
指令格式:
server_name name1 name2 ...
- name可以有多個并列名稱,而且此處的name支援正規表達式書寫
實際舉例:
| |
此時表示該虛拟主機可以接收類似域名 www1.myserver.com 等的請求而拒絕 www.myserver.com 的域名請求,是以說用正規表達式可以實作更精準的控制
至于基于IP的虛拟主機配置比較簡單,不再太贅述:
指令格式:
server_name IP位址
location配置
指令格式為:
location [ = | ~ | ~* | ^~ ] uri {...}
- 這裡的uri分為标準uri和正則uri,兩者的唯一差別是uri中是否包含正規表達式
uri前面的方括号中的内容是可選項,解釋如下:
- “=”:用于标準uri前,要求請求字元串與uri嚴格比對,一旦比對成功則停止
- “~”:用于正則uri前,并且區分大小寫
- “~*”:用于正則uri前,但不區分大小寫
- “^~”:用于标準uri前,要求Nginx找到辨別uri和請求字元串比對度最高的location後,立即使用此location處理請求,而不再使用location塊中的正則uri和請求字元串做比對
請求根目錄配置
- path:Nginx接收到請求以後查找資源的根目錄路徑
| |
設定網站的預設首頁
- file可以包含多個用空格隔開的檔案名,首先找到哪個頁面,就使用哪個頁面響應請求