【nginx】新手手冊(cè)(翻譯)


注:本文為nginx官網(wǎng) Beginner's Guide 的譯文淮腾。翻譯不易六荒,轉(zhuǎn)載請(qǐng)注明犀斋。


本手冊(cè)介紹了有關(guān)nginx的基礎(chǔ)知識(shí)钓试,并描述了nginx可以完成的幾項(xiàng)簡(jiǎn)單任務(wù)崔泵。讀者在閱讀本手冊(cè)前請(qǐng)確保自己的機(jī)器上已經(jīng)安裝好nginx脾拆。未安裝好的讀者可參考如何安裝nginx毒嫡。本手冊(cè)將介紹以下內(nèi)容:

  • 如何啟動(dòng)观腊、停止nginx
  • 如何重新載入其配置文件
  • nginx配置文件的結(jié)構(gòu)
  • 如何配置將nginx設(shè)置為靜態(tài)資源服務(wù)器
  • 如何將nginx設(shè)置為代理服務(wù)器
  • 如何使nginx關(guān)聯(lián)FastCGI應(yīng)用

nginx擁有一個(gè)主進(jìn)程和數(shù)個(gè)工作進(jìn)程谎仲。主進(jìn)程的主要任務(wù)是讀取配置文件浙垫、評(píng)估配置文件的合理性和維護(hù)工作進(jìn)程。工作進(jìn)程的任務(wù)是處理具體的請(qǐng)求。nginx采用事件驅(qū)動(dòng)模型和OS強(qiáng)相關(guān)機(jī)制確保能夠高效地將請(qǐng)求分配給各個(gè)工作進(jìn)程夹姥。工作進(jìn)程的數(shù)量可在配置文件中設(shè)置杉武,可以將數(shù)量定為某個(gè)數(shù)值,也可以使nginx按照CPU核心數(shù)自動(dòng)調(diào)整辙售。(見(jiàn)工作進(jìn)程

nginx和其各個(gè)模塊的工作方式由配置文件決定轻抱。默認(rèn)情況下,配置文件的名稱為nginx.conf旦部,位于 /usr/local/nginx/conf祈搜、 /etc/nginx/usr/local/etc/nginx文件夾中。

啟動(dòng)nginx士八、停止nginx容燕、重新載入配置文件

運(yùn)行nginx可執(zhí)行文件即可啟動(dòng)nginx。nginx啟動(dòng)后婚度,可通過(guò)在nginx可執(zhí)行文件后增加-s參數(shù)來(lái)控制nginx服務(wù)器蘸秘。語(yǔ)法如下:

nginx -s signal

signal為下列任一值:

  • stop — 快速地關(guān)閉
  • quit — 優(yōu)雅地關(guān)閉
  • reload — 重新載入配置文件
  • reopen — 重新打開(kāi)日志文件

例如,若要停止nginx各個(gè)進(jìn)程蝗茁,但停止之前須等待工作進(jìn)程處理完當(dāng)前的請(qǐng)求醋虏,則可運(yùn)行以下命令:

nginx -s quit

執(zhí)行該命令的用戶應(yīng)與啟動(dòng)nginx的用戶一致

命令nginx重新載入配置文件或重啟nginx之后,配置文件中做出的改變才會(huì)生效评甜。運(yùn)行以下命令即可命令nginx重新載入配置文件:

nginx -s reload

主進(jìn)程收到重新載入配置文件的信號(hào)后灰粮,該進(jìn)程會(huì)先檢查新配置文件的語(yǔ)法,然后嘗試應(yīng)用其中提供的配置忍坷。若成功粘舟,主進(jìn)程會(huì)啟動(dòng)新的工作進(jìn)程,并向舊工作進(jìn)程發(fā)送信息佩研,要求其停止工作柑肴。若不成功,主進(jìn)程回滾其做出的改變旬薯,繼續(xù)使用舊配置晰骑。主進(jìn)程收到停止命令后將不再接受新的連接,同時(shí)繼續(xù)處理當(dāng)前請(qǐng)求直至完成绊序。之后硕舆,舊工作進(jìn)程退出。

可以通過(guò)kill命令之類的Unix工具向nginx進(jìn)程發(fā)送信號(hào)骤公。在這種情況下抚官,信號(hào)會(huì)直接送至指定進(jìn)程ID下的進(jìn)程。nginx主進(jìn)程的進(jìn)程ID默認(rèn)被寫(xiě)入/usr/local/nginx/logs/var/run文件夾內(nèi)的nginx.pid文件阶捆。例如凌节,假設(shè)主進(jìn)程的ID是1628钦听,若需要向nginx發(fā)送QUIT信號(hào)使其優(yōu)雅關(guān)閉,則可執(zhí)行以下命令:

kill -s QUIT 1628

若需要列出所有運(yùn)行中的nginx進(jìn)程倍奢,可與下面的方式使用ps命令:

ps -ax | grep nginx

獲取與向nginx發(fā)送信號(hào)相關(guān)的更多信息朴上,訪問(wèn)控制nginx

配置文件的結(jié)構(gòu)

nginx由各個(gè)模塊組成卒煞,這些模塊由配置文件中的控制指令控制痪宰。指令分為簡(jiǎn)單指令和塊指令。簡(jiǎn)單指令由名稱跷坝、被空格隔開(kāi)的參數(shù)酵镜、結(jié)尾的分號(hào)(;)組成。塊指令與簡(jiǎn)單指令的結(jié)構(gòu)相同柴钻,但結(jié)尾不是分號(hào)淮韭,而是被花括號(hào)({})括住的一組額外的指令。若塊指令內(nèi)可嵌套被花括號(hào)括住的其他指令贴届,則可將該塊指令稱為一個(gè)上下文(events靠粪、httpserverlocation鏈接的網(wǎng)頁(yè)給出了示例)毫蚓。

在配置文件之內(nèi)占键、各上下文之外定義的指令處于main上下文中。eventshttp 指令處于main上下文中元潘,server 指令處于http上下文中畔乙,而 location指令則處于 server上下文中。

#開(kāi)頭的行為注釋行翩概。

動(dòng)靜分離

web服務(wù)器的一大重要功能就是解析文件(比如圖片或靜態(tài)HTML頁(yè)面)牲距。在這里,你將實(shí)現(xiàn)一個(gè)示例配置钥庇,使服務(wù)器能夠根據(jù)請(qǐng)求從不同的本地文件目錄(例如:/data/www(可能包含HTML文件)和/data/images(包含圖片))解析文件牍鞠。為達(dá)到這個(gè)目的,你需要編輯配置文件评姨,在包含兩個(gè)location塊的http塊內(nèi)配置一個(gè)server塊难述。

首先,創(chuàng)建/data/www文件目錄吐句,將包含文字內(nèi)容的index.html放置到該目錄內(nèi)胁后。接著創(chuàng)建/data/images目錄,將幾個(gè)圖片文件放置到里面嗦枢。

然后攀芯,打開(kāi)配置文件。文件中的默認(rèn)配置已經(jīng)包含了幾個(gè)示例server塊净宵,不過(guò)大多數(shù)被注釋掉了。目前先將所有這樣的塊指令注釋掉,然后定義一個(gè)新的server塊:

http {
     server {
     }
}

一般來(lái)說(shuō)择葡,配置文件可包含數(shù)個(gè)server塊紧武,各個(gè)塊的端口服務(wù)器名稱 不同。一旦nginx確定了當(dāng)前請(qǐng)求應(yīng)該由那個(gè)server處理敏储,它會(huì)根據(jù)server塊中location指令的參數(shù)比對(duì)請(qǐng)求頭中的URI阻星。

將下面的location塊寫(xiě)入server塊中:

location / {
    root /data/www;
}

location 塊規(guī)定應(yīng)以/前綴比對(duì)請(qǐng)求中的URI。若請(qǐng)求吻合已添,其中的URI將被拼接到root指令給出的路徑后妥箕,即拼接到 /data/www后,以生成被請(qǐng)求的文件在本地文件系統(tǒng)中的路徑更舞。如果匹配的 location 塊有多個(gè)畦幢,nginx會(huì)優(yōu)先選擇前綴最長(zhǎng)的那個(gè)。 上面給出的location 塊定義的前綴長(zhǎng)度為1缆蝉,最短宇葱,因此只有在其他所有location塊都不匹配的情況下,nginx才會(huì)選擇該location塊刊头。

接著將第二個(gè)location塊寫(xiě)入server塊中:

location /images/ {
     root /data;
}

location塊將匹配以/images/ 開(kāi)頭的請(qǐng)求(location /也匹配這樣的請(qǐng)求黍瞧,但是其定義的前綴更短)。

此時(shí)原杂,配置后的server塊是這樣的:

server {
     location / {
         root /data/www;
     }
 
     location /images/ {
         root /data;
     }
 }

這樣就已經(jīng)配置了一個(gè)可用的nginx服務(wù)器了印颤,該服務(wù)器監(jiān)聽(tīng)80端口,在本機(jī)可通過(guò)http://localhost/訪問(wèn)穿肄。當(dāng)請(qǐng)求中的URI以/images開(kāi)頭時(shí)年局,服務(wù)器將從/data/images目錄解析文件。例如被碗,對(duì) http://localhost/images/example.png 請(qǐng)求進(jìn)行回應(yīng)時(shí)某宪,nginx將返回/data/images/example.png 文件。如果該文件不存在锐朴,nginx將返回404錯(cuò)誤兴喂。不以/images/開(kāi)頭的URI將被映射到 /data/www目錄。例如焚志,對(duì)http://localhost/some/example.html 請(qǐng)求衣迷,nginx將返回/data/www/some/example.html 文件。

啟動(dòng)nginx(若還未啟動(dòng))或通過(guò)以下命令向nginx主進(jìn)程發(fā)送reload信號(hào)可使配置文件中所做修改生效:

nginx -s reload

若執(zhí)行命令時(shí)出現(xiàn)錯(cuò)誤酱酬,你可在 /usr/local/nginx/logs/var/log/nginx的目錄下的access.logerror.log文件中找到出錯(cuò)的原因壶谒。

搭建一個(gè)簡(jiǎn)單的代理服務(wù)器

nginx最廣泛的應(yīng)用場(chǎng)景就是代理服務(wù)器。代理服務(wù)器的工作流程通常是:接收請(qǐng)求膳沽、將請(qǐng)求轉(zhuǎn)發(fā)給被代理的服務(wù)器汗菜、從被代理的服務(wù)器接收回應(yīng)让禀、將回應(yīng)發(fā)送給客戶端。

我們接下來(lái)將配置一個(gè)基礎(chǔ)的代理服務(wù)器陨界。若是圖片請(qǐng)求巡揍,則該服務(wù)器會(huì)從本地目錄解析文件,否則將會(huì)將請(qǐng)求發(fā)送給一個(gè)被代理的服務(wù)器菌瘪。本示例中的兩個(gè)服務(wù)器將在單個(gè)nginx實(shí)例中定義腮敌。

首先,在nginx的配置文件中增添一個(gè)server塊來(lái)充當(dāng)被代理的服務(wù)器俏扩,server塊中的內(nèi)容如下:

server {
     listen 8080;
     root /data/up1;
 
     location / {
     }
 }

這樣就配置好一臺(tái)監(jiān)聽(tīng)8080端口的服務(wù)器(之前因?yàn)槭褂昧藰?biāo)準(zhǔn)的80端口糜工,所以不需要使用listen指令),并將所有請(qǐng)求映射到本地文件系統(tǒng)的/data/up1目錄录淡。創(chuàng)建該目錄捌木,然后將index.html放到該目錄中。注意赁咙,root指令位于server上下文中钮莲。若選中的location塊沒(méi)有包含自己的root指令,系統(tǒng)就會(huì)自動(dòng)使用在server上下文中定義的root指令彼水。

接下來(lái)崔拥,將上一節(jié)中用到的服務(wù)器配置修改為代理服務(wù)器的配置。在第一個(gè)location塊中加入proxy_pass指令凤覆,指令的參數(shù)中應(yīng)聲明代理服務(wù)器的協(xié)議链瓦、名稱和端口。

server {
     location / {
         proxy_pass http://localhost:8080;
     }
 
     location /images/ {
         root /data;
     }
 }

第二個(gè) location 塊指令目前將以/images/開(kāi)頭的請(qǐng)求映射到/data/images目錄下的文件盯桦。我們將修改該指令慈俯,使其參數(shù)可以匹配帶有典型圖片文件擴(kuò)展名的圖片請(qǐng)求。修改后的 location 快是這樣的:

location ~ \.(gif|jpg|png)$ {
    root /data/images;
}

location指令的參數(shù)是正則表達(dá)式拥峦,可匹配所有以 .gif贴膘、.jpg.png結(jié)尾的URI。使用正則表達(dá)式作為參數(shù)時(shí)應(yīng)先在前輸入~略号。相應(yīng)的請(qǐng)求將被映射到 /data/images 目錄刑峡。

當(dāng)nginx根據(jù)請(qǐng)求選擇location塊時(shí),它首先檢查參數(shù)為前綴的location指令玄柠,記住前綴最長(zhǎng)的location塊突梦,然后再檢查正則表達(dá)式。如果某個(gè)正則表達(dá)式匹配成功羽利,nginx會(huì)選擇這個(gè)location塊宫患,否則使用先前記住的location塊。

代理服務(wù)器最終的配置文件如下:

server {
     location / {
         proxy_pass http://localhost:8080/;
     }
 
     location ~ \.(gif|jpg|png)$ {
         root /data/images;
     }
}

該服務(wù)器會(huì)過(guò)濾以.gif这弧、 .jpg.png結(jié)尾的請(qǐng)求娃闲,并將它們映射到/data/images目錄(通過(guò)將URI拼接到root指令的參數(shù)后)虚汛, 然后所有其他請(qǐng)求傳遞給之前配置的被代理服務(wù)器。

為使新的配置文件生效皇帮,按照之前介紹的方式將reload信號(hào)發(fā)送給nginx泽疆。

除上面用到的指令外,可以使用很多其他的指令對(duì)代理服務(wù)器進(jìn)行深度配置玲献。

配置 FastCGI 代理

可以使用nginx將請(qǐng)求路由到FastCGI服務(wù)器,在這種服務(wù)器上運(yùn)行的程序通常由多種框架和編程語(yǔ)言(例如PHP)寫(xiě)成梯浪。

最基礎(chǔ)的FastCGI服務(wù)器配置中會(huì)用到fastcgi_pass指令(而非proxy_pass 指令)以及fastcgi_param 指令(用于聲明需傳遞給FastCGI服務(wù)器的參數(shù))捌年。假設(shè)可通過(guò)localhost:9000訪問(wèn)FastCGI。以之前的代理服務(wù)器配置為模板挂洛,用fastcgi_pass指令替代proxy_pass指令礼预,然后將fastcgi_pass的參數(shù)指定為 localhost:9000。在PHP中虏劲,SCRIPT_FILENAME 參數(shù)用于確定腳本名稱托酸,QUERY_STRING 參數(shù)用于傳遞請(qǐng)求參數(shù)。最終的配置文件將會(huì)是這樣:

 server {
     location / {
         fastcgi_pass  localhost:9000;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param QUERY_STRING    $query_string;
     }
 
     location ~ \.(gif|jpg|png)$ {
         root /data/images;
     }
 }

這樣就配置了一個(gè)可將所有請(qǐng)求(靜態(tài)圖片請(qǐng)求除外)路由到 localhost:9000處使用 FastCGI協(xié)議的被代理服務(wù)器柒巫。


歡迎到 作者github主頁(yè)交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末励堡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堡掏,更是在濱河造成了極大的恐慌应结,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泉唁,死亡現(xiàn)場(chǎng)離奇詭異鹅龄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)亭畜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)扮休,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拴鸵,你說(shuō)我怎么就攤上這事玷坠。” “怎么了宝踪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵侨糟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瘩燥,道長(zhǎng)秕重,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任厉膀,我火速辦了婚禮溶耘,結(jié)果婚禮上二拐,老公的妹妹穿的比我還像新娘。我一直安慰自己凳兵,他們只是感情好百新,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著庐扫,像睡著了一般饭望。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上形庭,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天铅辞,我揣著相機(jī)與錄音,去河邊找鬼萨醒。 笑死斟珊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的富纸。 我是一名探鬼主播囤踩,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晓褪!你這毒婦竟也來(lái)了堵漱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涣仿,失蹤者是張志新(化名)和其女友劉穎怔锌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體变过,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埃元,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了媚狰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岛杀。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖崭孤,靈堂內(nèi)的尸體忽然破棺而出类嗤,到底是詐尸還是另有隱情,我是刑警寧澤辨宠,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布遗锣,位于F島的核電站,受9級(jí)特大地震影響嗤形,放射性物質(zhì)發(fā)生泄漏精偿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笔咽。 院中可真熱鬧搔预,春花似錦、人聲如沸叶组。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)甩十。三九已至船庇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侣监,已是汗流浹背溢十。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留达吞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓荒典,卻偏偏與公主長(zhǎng)得像酪劫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寺董,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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