寫(xiě)在前面
Nginx是高性能輕量級(jí)WEB服務(wù)器的優(yōu)秀代表,由于其提供HTTP代理和反向代理铲掐、負(fù)載均衡拾弃、緩存等一系列重要特性,從而廣泛應(yīng)用于當(dāng)今的Web后端服務(wù)之中摆霉,而且各大互聯(lián)網(wǎng)公司也都在重度使用豪椿,所以作為一個(gè)開(kāi)發(fā)者,學(xué)會(huì)Nginx的使用和配置很有必要携栋。
在本文中搭盾,我們將會(huì)從一份示例配置清單開(kāi)始,來(lái)簡(jiǎn)單梳理一下Nginx服務(wù)器的各種常見(jiàn)配置指令的作用和用法刻两。
話不多說(shuō)增蹭,上菜!
本文在GitHub開(kāi)源倉(cāng)庫(kù)「編程之路」 https://github.com/rd2coding/Road2Coding 中已經(jīng)收錄磅摹,里面有我整理的6大編程方向(崗位)的自學(xué)路線+知識(shí)點(diǎn)大梳理滋迈、面試考點(diǎn)、我的簡(jiǎn)歷户誓、幾本硬核pdf筆記饼灿,以及我的程序員人生,歡迎鑒賞帝美。
Nginx配置文件的整體結(jié)構(gòu)
這里直接畫(huà)一幅圖就一目了然了碍彭,幾個(gè)大的配置模塊看得就很清楚。
從圖中可以看出主要包含以下幾大部分內(nèi)容:
1. 全局塊
該部分配置主要影響Nginx全局悼潭,通常包括下面幾個(gè)部分:
- 配置運(yùn)行Nginx服務(wù)器用戶(組)
- worker進(jìn)程數(shù)
- Nginx進(jìn)程PID存放路徑
- 錯(cuò)誤日志的存放路徑
- 配置文件的引入
- ...
2. events塊
該部分配置主要影響Nginx服務(wù)器與用戶的網(wǎng)絡(luò)連接庇忌,主要包括:
- 設(shè)置網(wǎng)絡(luò)連接的序列化
- 是否允許同時(shí)接收多個(gè)網(wǎng)絡(luò)連接
- 事件驅(qū)動(dòng)模型的選擇
- 最大連接數(shù)的配置
- ...
3. http塊
- 定義MIMI-Type
- 自定義服務(wù)日志
- 是否允許sendfile方式傳輸文件
- 連接超時(shí)時(shí)間
- 單連接請(qǐng)求數(shù)上限
- ...
4. server塊
- 配置網(wǎng)絡(luò)端口監(jiān)聽(tīng)
- 訪問(wèn)日志和錯(cuò)誤頁(yè)
- 基于名稱的虛擬主機(jī)配置
- 基于IP的虛擬主機(jī)配置
- location塊配置
- ...
5. location塊
- location配置
- 請(qǐng)求根目錄配置
- 更改location的URI
- 網(wǎng)站默認(rèn)首頁(yè)配置
- ...
一份配置清單例析
這里給出了一份簡(jiǎn)要的Nginx配置清單舉例:
配置代碼如下:
user nobody nobody;
worker_processes 3;
error_log logs/error.log;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 8088;
server_name codesheep;
access_log /codesheep/webserver/server1/log/access.log;
error_page 404 /404.html;
location /server1/location1 {
root /codesheep/webserver;
index index.server2-location1.htm;
}
location /server1/location2 {
root /codesheep/webserver;
index index.server2-location2.htm;
}
}
server {
listen 8089;
server_name 192.168.31.177;
access_log /codesheep/webserver/server2/log/access.log;
error_page 404 /404.html;
location /server2/location1 {
root /codesheep/webserver;
index index.server2-location1.htm;
}
location /srv2/loc2 {
alias /codesheep/webserver/server2/location2/;
index index.server2-location2.htm;
}
location = /404.html {
root /codesheep/webserver/;
index 404.html;
}
}
}
接下來(lái)就對(duì)照這份示例配置清單來(lái)詳細(xì)剖析一下配置文件中幾個(gè)主要指令的含義及用法。
Nginx用戶(組)配置
配置項(xiàng)格式:user user [group];
- user:指定可以運(yùn)行Nginx的用戶
- group:指定可以運(yùn)行Nginx的用戶組(可選項(xiàng))
如果user指令不配置或者配置為 user nobody nobody
舰褪,則默認(rèn)所有用戶都可以啟動(dòng)Nginx進(jìn)程皆疹。
worker進(jìn)程數(shù)配置
這是Nginx服務(wù)器實(shí)現(xiàn)并發(fā)處理的關(guān)鍵配置,配置項(xiàng)格式為:
worker_processes number數(shù);
- number:Nginx進(jìn)程最多可以產(chǎn)生的worker process數(shù)
- 如果設(shè)置為auto占拍,則Nginx將進(jìn)行自動(dòng)檢測(cè)
按照上文中的配置清單的實(shí)驗(yàn)略就,我們給worker_processes配置的數(shù)目是:3,啟動(dòng)Nginx服務(wù)器后晃酒,我們可以后臺(tái)看一下主機(jī)上的Nginx進(jìn)程情況:
ps -aux | grep nginx
很明顯表牢,理解 worker_processes
這個(gè)指令的含義就很容易了
error日志路徑配置
配置項(xiàng)格式:error_log file [可選日志級(jí)別];
- file:指定日志輸出到某個(gè)文件file
- 常見(jiàn)的可選日志級(jí)別包括:info贝次、debug崔兴、warn、error...等
Nginx進(jìn)程PID存放路徑配置
由于Nginx進(jìn)程是作為系統(tǒng)守護(hù)進(jìn)程在后臺(tái)運(yùn)行,所以該選項(xiàng)用于自定義配置PID文件的保存路徑敲茄。
配置項(xiàng)格式:pid file;
- file:指定其存放路徑+文件名稱
- 如果不指定默認(rèn)置于路徑
logs/nginx.pid
事件驅(qū)動(dòng)模型配置
配置項(xiàng)格式:use model;
- model模型可選擇項(xiàng)包括:select螺戳、poll、kqueue折汞、epoll、rtsig等......
最大連接數(shù)配置
配置項(xiàng)格式:worker_connections number數(shù);
- number默認(rèn)值為512盖腿,表示允許每一個(gè)worker進(jìn)程可以同時(shí)開(kāi)啟的最大連接數(shù)爽待。
配置文件的引入
該配置主要用于引入其他或者第三方的Nginx配置文件到當(dāng)前的主配置文件中
配置項(xiàng)格式:include conf_file;
網(wǎng)絡(luò)連接的序列化配置
配置項(xiàng)格式:accept_mutex on;
- 該配置默認(rèn)為on狀態(tài),表示會(huì)對(duì)多個(gè)Nginx工作進(jìn)程接收連接進(jìn)行序列化翩腐,防止多個(gè)worker進(jìn)程對(duì)連接的爭(zhēng)搶鸟款。
說(shuō)到該指令,首先得闡述一下什么是所謂的“驚群?jiǎn)栴}”茂卦。就Nginx的場(chǎng)景來(lái)解釋的話大致的意思就是:當(dāng)一個(gè)新網(wǎng)絡(luò)連接來(lái)到時(shí)何什,多個(gè)worker進(jìn)程會(huì)被同時(shí)喚醒,但僅僅只有一個(gè)進(jìn)程可以真正獲得連接并處理之等龙。如果每次喚醒的進(jìn)程數(shù)目過(guò)多的話处渣,其實(shí)是會(huì)影響一部分性能的。
所以在這里蛛砰,如果accept_mutex on罐栈,那么多個(gè)worker將是以串行方式來(lái)處理,其中有一個(gè)worker會(huì)被喚醒泥畅;反之若accept_mutex off荠诬,那么所有的worker都會(huì)被喚醒,不過(guò)只有一個(gè)worker能獲取新連接位仁,其它的worker會(huì)重新進(jìn)入休眠狀態(tài)柑贞。
這個(gè)值的開(kāi)關(guān)與否其實(shí)是要和具體場(chǎng)景掛鉤的,一定程度上會(huì)影響系統(tǒng)的吞吐量聂抢。Nginx默認(rèn)打開(kāi)了accept_mutex钧嘶,也算是一種保守的做法。
多網(wǎng)絡(luò)連接 接收配置
配置項(xiàng)格式:multi_accept off;
- 該配置默認(rèn)為off涛浙,意指每個(gè)worker進(jìn)程一次只能接收一個(gè)新到達(dá)的網(wǎng)絡(luò)連接康辑。如果想讓每個(gè)Nginx的worker process都能同時(shí)接收多個(gè)網(wǎng)絡(luò)連接,則需要開(kāi)啟此配置轿亮。
MIME-Type定義
MIME-Type指的是網(wǎng)絡(luò)資源的媒體類型疮薇,也即前端請(qǐng)求的資源類型。
配置項(xiàng)格式:
include mime.types;
default_type type類型;
- include配置用于將mime.types文件包含進(jìn)來(lái)
可以用cat mime.types
來(lái)查看mime.types的文件內(nèi)容我注,我們發(fā)現(xiàn)其就是一個(gè)types結(jié)構(gòu)按咒,里面包含了各種瀏覽器能夠識(shí)別的MIME類型以及對(duì)應(yīng)類型的文件后綴名,如下所示:
訪問(wèn)日志配置
配置項(xiàng)格式:
access_log path [format];
- path:自定義訪問(wèn)日志的路徑+名稱
- format:自定義服務(wù)日志的格式(可選項(xiàng))。
連接超時(shí)配置
配置項(xiàng)格式:keepalive_timeout timeout [header_timeout];
- timeout 表示server端對(duì)連接的保持時(shí)間
- header_timeout表示在應(yīng)答報(bào)文頭部的 Keep-Alive 域設(shè)置超時(shí)時(shí)間励七,可選項(xiàng)智袭。
sendfile配置
配置項(xiàng)格式:
sendfile on;
- sendfile配置用于開(kāi)啟或關(guān)閉使用sendfile()系統(tǒng)調(diào)用來(lái)傳輸文件,默認(rèn)off
- 注:在很多Web Server中掠抬,都引入了 sendfile的機(jī)制吼野,來(lái)實(shí)現(xiàn)高性能文件傳輸。
網(wǎng)絡(luò)地址監(jiān)聽(tīng)配置
配置項(xiàng)格式:
- 第一種:配置監(jiān)聽(tīng)的IP地址:
listen IP[:PORT];
- 第二種:配置監(jiān)聽(tīng)的端口:
listen PORT;
實(shí)際舉例:
listen 192.168.31.177:8080; # 監(jiān)聽(tīng)特定IP和端口上的連接
listen 192.168.31.177; # 監(jiān)聽(tīng)特定IP上所有端口的連接
listen 8080; # 監(jiān)聽(tīng)特定端口上的所有IP的連接
基于名稱或IP的虛擬主機(jī)配置
配置項(xiàng)格式:server_name name1 name2 ...
- name可以有多個(gè)并列名稱两波,而且此處的name支持正則表達(dá)式書(shū)寫(xiě)
實(shí)際舉例:
server_name ~^www\.codesheep\d+\.com$;
至于基于IP的虛擬主機(jī)配置就更簡(jiǎn)單了:
配置項(xiàng)格式:server_name IP地址
location配置
配置項(xiàng)格式為:location [ = | ~ | ~* | ^~ ] /uri/ {...}
- 這里的uri可包含正則表達(dá)式的模糊匹配瞳步。
uri前面的方括號(hào)中的內(nèi)容是可選項(xiàng),幾種常見(jiàn)的情形如下:
- “=”:用于標(biāo)準(zhǔn)uri腰奋,進(jìn)行字符串的精確匹配
- “~”:用于正則uri单起,表示區(qū)分大小寫(xiě)的匹配
- “~*”:用于正則uri,表示不區(qū)分大小寫(xiě)的匹配
- “~”:用于標(biāo)準(zhǔn)uri劣坊,進(jìn)行前綴匹配嘀倒,~表示區(qū)分大小寫(xiě)
根目錄配置
配置項(xiàng)格式:root path;
- path:表示Nginx接收到請(qǐng)求以后查找資源的根目錄路徑
當(dāng)然,也還可以通過(guò)alias指令來(lái)更改location接收到的URI請(qǐng)求路徑局冰,指令為:
alias path; # path為修改后的根路徑
默認(rèn)首頁(yè)配置
配置項(xiàng)格式:index index_file ......
- index_file可以包含多個(gè)用空格隔開(kāi)的文件名测蘑,首先找到哪個(gè)頁(yè)面,就使用哪個(gè)進(jìn)行響應(yīng)康二。
后 記
另外前段時(shí)間花了大把力氣帮寻,把自用的編程學(xué)習(xí)資源做了個(gè)大整理。
都是純肝貨赠摇,目錄如下固逗。
該內(nèi)容在GitHub開(kāi)源倉(cāng)庫(kù)「編程之路」 https://github.com/rd2coding/Road2Coding 中已經(jīng)收錄,里面有我整理的6大編程方向(崗位)的自學(xué)路線+知識(shí)點(diǎn)大梳理藕帜、面試考點(diǎn)烫罩、我的簡(jiǎn)歷、幾本硬核pdf筆記洽故,以及我的程序員人生贝攒,歡迎star。
下篇見(jiàn)时甚!