看完這篇還不了解Nginx服務(wù)器配置千康,那我要哭了

寫(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è)大的配置模塊看得就很清楚。

image

從圖中可以看出主要包含以下幾大部分內(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配置清單舉例:

image

配置代碼如下:

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è)指令的含義就很容易了

image

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)類型的文件后綴名,如下所示:

image

訪問(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è)大整理。

都是純肝貨赠摇,目錄如下固逗。

image

該內(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)时甚!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隘弊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荒适,更是在濱河造成了極大的恐慌梨熙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刀诬,死亡現(xiàn)場(chǎng)離奇詭異咽扇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)质欲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)树埠,“玉大人魂毁,你說(shuō)我怎么就攤上這事箱舞〔未酰” “怎么了绵咱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)兜粘。 經(jīng)常有香客問(wèn)我构挤,道長(zhǎng)散吵,這世上最難降的妖魔是什么耽装? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮期揪,結(jié)果婚禮上掉奄,老公的妹妹穿的比我還像新娘。我一直安慰自己凤薛,他們只是感情好姓建,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缤苫,像睡著了一般速兔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上活玲,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天涣狗,我揣著相機(jī)與錄音,去河邊找鬼舒憾。 笑死镀钓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镀迂。 我是一名探鬼主播丁溅,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼探遵!你這毒婦竟也來(lái)了窟赏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤箱季,失蹤者是張志新(化名)和其女友劉穎涯穷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體藏雏,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡求豫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝠嘉。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡最疆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚤告,到底是詐尸還是另有隱情努酸,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布杜恰,位于F島的核電站获诈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏心褐。R本人自食惡果不足惜舔涎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逗爹。 院中可真熱鬧亡嫌,春花似錦、人聲如沸掘而。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袍睡。三九已至知染,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斑胜,已是汗流浹背控淡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留止潘,地道東北人逸寓。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像覆山,于是被迫代替她去往敵國(guó)和親竹伸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容