注:本文為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靠粪、http、server和location鏈接的網(wǎng)頁(yè)給出了示例)毫蚓。
在配置文件之內(nèi)占键、各上下文之外定義的指令處于main上下文中。events
和 http
指令處于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.log
和error.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è)交流