編譯自:
http://nginx.org/en/docs/beginners_guide.html
** 目錄
nginx 啟動(dòng)展融、停止睦擂、重新加載配置
nginx 配置文件的結(jié)構(gòu)
nginx 提供靜態(tài)內(nèi)容的服務(wù)
將 nginx 配置為簡(jiǎn)單的代理服務(wù)器
nginx 設(shè)置 FastCGI 代理扫夜,連接 FastCGI 應(yīng)用 **
本文會(huì)簡(jiǎn)單介紹 nginx 并演示相關(guān)的簡(jiǎn)單任務(wù)蜓斧。首先你需要安裝好 nginx列赎。
nginx 擁有一個(gè)主進(jìn)程和幾個(gè) worker 進(jìn)程表鳍。主進(jìn)程的主要工作是讀取和處理配置,維護(hù) worker 進(jìn)程逾冬。worker 進(jìn)程負(fù)責(zé)處理實(shí)際的用戶(hù)請(qǐng)求黍聂。nginx 采用 event-based 模型和 OS-dependent 機(jī)制對(duì)用戶(hù)請(qǐng)求進(jìn)行高效的分發(fā)。worker 進(jìn)程的數(shù)量在配置文件中定義身腻,可在配置中修改产还,或者根據(jù)可用的 CPU 核心數(shù)進(jìn)行自動(dòng)調(diào)整。參考 worker_processes
Syntax: worker_processes number | auto;
Default:
worker_processes 1;
Context: main
Defines the number of worker processes.
worker 進(jìn)程的最佳個(gè)數(shù)受許多因素影響嘀趟,比如 CPU 核心數(shù)脐区,磁盤(pán)驅(qū)動(dòng)的個(gè)數(shù),nginx 負(fù)載模式等她按。如果不確定設(shè)為多少合適牛隅,可設(shè)置為 CPU 核心數(shù)炕柔。設(shè)置為 auto,nginx 會(huì)嘗試自動(dòng)檢測(cè)CPU核心數(shù)并設(shè)置為 worker 進(jìn)程數(shù)媒佣。(auto 參數(shù)從 1.3.8 和 1.2.5 版開(kāi)始支持)
nginx 及其模塊的工作由配置文件定義匕累,默認(rèn)的配置文件為 nginx.conf,該配置文件可能位于:
/usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx
.
nginx 啟動(dòng)默伍、停止欢嘿、重新加載配置
執(zhí)行 nginx 命令啟動(dòng) nginx。啟動(dòng) nginx 之后也糊,可使用如下命令:
nginx -s stop 快速關(guān)閉 nginx
nginx -s quit 優(yōu)雅的關(guān)閉 nginx
nginx -s reload 重新加載配置
nginx -s reopen 重新打開(kāi)日志文件
優(yōu)雅地關(guān)閉 nginx炼蹦,這是說(shuō) nginx 主進(jìn)程會(huì)等待 worker 進(jìn)程完成當(dāng)前用戶(hù)請(qǐng)求的處理。
執(zhí)行:nginx -s quit
(以啟動(dòng) nginx 時(shí)的用戶(hù)身份執(zhí)行該命令)
更改配置之后显设,必須執(zhí)行重新加載配置的命令框弛,或者重新啟動(dòng) nginx,以使得配置生效:
nginx -s reload
當(dāng)主進(jìn)程接收到 reload 信號(hào)捕捂,它會(huì)檢查配置文件的語(yǔ)法,然后嘗試應(yīng)用該配置斗搞。如果成功指攒,主進(jìn)程啟動(dòng)新的 worker 進(jìn)程,并發(fā)送消息給原來(lái)的 worker 進(jìn)程要求他們關(guān)閉僻焚。如果加載配置失敗允悦,主進(jìn)程會(huì)對(duì)于改動(dòng)進(jìn)行回滾,繼續(xù)以原來(lái)的配置進(jìn)行工作虑啤。當(dāng)原來(lái)的 worker 進(jìn)程接收到消息要他們關(guān)閉隙弛,他們會(huì)停止接收新的連接,并繼續(xù)處理當(dāng)前的請(qǐng)求知道完成狞山。完成之后全闷,原來(lái)的 worker 進(jìn)程將會(huì)退出。
給 nginx 發(fā)送信號(hào)萍启,可借助于 kill 命令总珠。kill 命令使用進(jìn)程 pid 發(fā)送信號(hào)。nginx 主進(jìn)程的 pid 存儲(chǔ)在 pid 文件中勘纯,默認(rèn)為 nginx.pid
局服,位于 /usr/local/nginx/logs
或 /var/run
目錄下。
例如驳遵,如果 nginx 主進(jìn)程 pid 為 1628淫奔,使用 kill 命令發(fā)送 QUIT 信號(hào)給 nginx,使其優(yōu)雅地關(guān)閉:
kill -s QUIT 1628
如果要獲取所有運(yùn)行中的 nginx 進(jìn)程的列表堤结,使用 ps 命令:
ps -ax | grep nginx
關(guān)于發(fā)送信號(hào)給 nginx 的更多信息唆迁,請(qǐng)參考: http://nginx.org/en/docs/control.html
配置文件的結(jié)構(gòu)
nginx 由許多模塊組成佳鳖,這些模塊可在配置文件中進(jìn)行配置。nginx 的配置指令分為:簡(jiǎn)單配置指令媒惕,區(qū)塊配置指令系吩。
簡(jiǎn)單配置指令由 “名稱(chēng)” 和 “參數(shù)” 組成, “名稱(chēng)” 和 “參數(shù)” 以空格分隔妒蔚,指令的最后以分號(hào) “;” 為結(jié)尾穿挨。
區(qū)塊配置指令和簡(jiǎn)單配置指令擁有同樣的結(jié)構(gòu),區(qū)塊指令不以分號(hào)結(jié)尾肴盏。區(qū)塊指令使用花括號(hào) “{}” 將一組設(shè)置包含于其中科盛。如果在區(qū)塊指令的括號(hào)中包含其他指令,這個(gè)區(qū)塊指令就被稱(chēng)為 “context” (上下文)菜皂。例如 events,http,server,location 指令贞绵。
所有在 context 之外的指令,被認(rèn)為處于 main context 之中恍飘。
events 和 http 指令用于 main context 之中榨崩。
server 指令用于 http 之中。
location 指令用于 server 指令之中章母。
配置文件中以 # 起始的行為注釋行母蛛。
nginx 提供靜態(tài)內(nèi)容的服務(wù)
web 服務(wù)器的重要任務(wù)之一是提供文件服務(wù)(比如 image 文件、靜態(tài) HTML 頁(yè)面等)乳怎。
我們將實(shí)現(xiàn)一個(gè)示例彩郊,根據(jù)請(qǐng)求的不同,nginx 通過(guò)不同的目錄提供文件給用戶(hù)蚪缀。我們通過(guò)
/data/www 目錄提供 HTML 文件秫逝,通過(guò) /data/images 目錄提供 image 文件。
為達(dá)到這個(gè)目標(biāo)询枚,需要在配置文件中設(shè)置 server 區(qū)塊违帆,并在 server 區(qū)塊中設(shè)置兩個(gè) location 區(qū)塊。server 區(qū)塊位于 http 區(qū)塊之中哩盲。
首先前方,創(chuàng)建 /data/www 目錄,并在其中創(chuàng)建 index.html 文件廉油,文件內(nèi)容任意惠险,比如:
echo "<h1>HTML File</h1>" > /data/www/index.html
然后創(chuàng)建 /data/images 目錄,放一些圖像文件到該目錄中抒线。
之后打開(kāi)配置文件班巩。默認(rèn)的配置文件已經(jīng)包含一些 server 區(qū)塊的示例,大多數(shù)被注釋了。
現(xiàn)在將所有 server 區(qū)塊注釋掉抱慌,然后創(chuàng)建一個(gè)新的 server 區(qū)塊:
http {
server {
}
}
一般來(lái)說(shuō)逊桦,配置文件可能包含幾個(gè) server 區(qū)塊,它們擁有不同的監(jiān)聽(tīng)端口(listen指令)和 server name抑进。一旦 nginx 決定好使用哪一個(gè) server 處理用戶(hù)請(qǐng)求强经,nginx 測(cè)試請(qǐng)求首部的 URI 字段,將它與 server 區(qū)塊中的 location 指令定義的參數(shù)進(jìn)行對(duì)比寺渗。
在 server 區(qū)塊中添加如下 location 區(qū)塊:
location / {
root /data/www;
}
這個(gè) location 區(qū)塊指定 “/” 前綴匿情,并將它和請(qǐng)求首部中的 URI 進(jìn)行比較。對(duì)于匹配的請(qǐng)求信殊,URI 將被添加到 root 指令所指定的路徑的末尾炬称,這里 root 指令定義的路徑是 /data/www,這樣形成用戶(hù)所請(qǐng)求的文件的本地路徑涡拘。如果有多個(gè) location 區(qū)塊與請(qǐng)求的 URI 匹配玲躯,nginx 選擇其中前綴最長(zhǎng)的那個(gè) location 區(qū)塊。
這里的 location 提供了最短的前綴鳄乏,長(zhǎng)度為 1跷车,所以只有當(dāng)所有其他 location 區(qū)塊都匹配失敗,才會(huì)選擇這個(gè) location 區(qū)塊汞窗。
下一步姓赤,添加第二個(gè) location 區(qū)塊:
location /images/ {
root /data;
}
這個(gè) location 區(qū)塊能夠匹配 URI 以 /images/ 起始的請(qǐng)求 (location / 也能匹配這樣的請(qǐng)求,但它的前綴比 /images/ 短仲吏,所以?xún)?yōu)先匹配 location /images/)
我們的 server 區(qū)塊的配置是這樣的:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
這已經(jīng)是一個(gè)可工作的服務(wù)配置,nginx 監(jiān)聽(tīng)于 80 端口蝌焚,可通過(guò)本地訪(fǎng)問(wèn) http://localhost/
裹唆。對(duì)于 URI 以 /images/ 起始的請(qǐng)求,nginx 會(huì)將 /data/images 目錄中的文件發(fā)送給客戶(hù)端只洒。
例如许帐,對(duì)于訪(fǎng)問(wèn)請(qǐng)求:http://localhost/images/example.png
,nginx 會(huì)發(fā)送 /data/images/example.png
文件毕谴。如果這個(gè)文件不存在成畦,nginx 會(huì)發(fā)送 404 error 響應(yīng)給客戶(hù)端。
對(duì)于 URI 不是以 /images/ 起始的請(qǐng)求涝开,會(huì)被映射到 /data/www 目錄循帐。
例如,對(duì)于訪(fǎng)問(wèn)請(qǐng)求:http://localhost/some/example.html
舀武,nginx 會(huì)發(fā)送 /data/www/some/example.html
文件拄养。
修改了配置文件之后,為使新配置生效银舱,可重啟 nginx 瘪匿,或者使用 nginx 命令發(fā)送 reload 信號(hào)給 nginx 主進(jìn)程:
nginx -s reload
Note:
當(dāng)出現(xiàn)了錯(cuò)誤跛梗,請(qǐng)查看 access.log 和 error.log 文件尋找可能的原因。
這兩個(gè)文件的位置如果是 yum 安裝棋弥,在 /var/log/nginx 目錄下核偿,如果是編譯安裝,默認(rèn)在 prefix/logs/ 目錄下顽染。
將 nginx 配置為簡(jiǎn)單的代理服務(wù)器
nginx 經(jīng)常被用來(lái)設(shè)置成一個(gè)代理服務(wù)器漾岳,這時(shí) nginx 接收請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給被代理的后端服務(wù)器家乘,并從后端服務(wù)器取回響應(yīng)報(bào)文蝗羊,然后發(fā)送給客戶(hù)端。
我們將配置一個(gè)基礎(chǔ)的代理服務(wù)器仁锯,服務(wù)器對(duì)于 image 文件的請(qǐng)求選擇從本地響應(yīng)耀找,對(duì)于其他請(qǐng)求,服務(wù)器轉(zhuǎn)發(fā)給一個(gè)后端服務(wù)器业崖。在這個(gè)示例中野芒,這兩個(gè)服務(wù)器將被定義在同一個(gè) nginx 實(shí)例之上。
首先定義后端服務(wù)器双炕,添加一個(gè) server 區(qū)塊定義:
server {
listen 8080;
root /data/up1;
location / {
}
}
這個(gè)服務(wù)器監(jiān)聽(tīng)在 8080 端口(在前一小節(jié)的配置中狞悲,我們并沒(méi)有指定 listen 指令,nginx 默認(rèn)使用 80 端口)妇斤,并將所有請(qǐng)求映射到本地的 /data/up1 目錄中摇锋。創(chuàng)建 /data/up1 目錄,并在其中創(chuàng)建一個(gè) index.html 文件站超。注意 root 指令被放置于 server context 中荸恕,這樣只有當(dāng)一個(gè)沒(méi)有包含自己的 root 指令的 location 區(qū)塊
被選中時(shí),這個(gè) server 區(qū)塊中的 root 指令才會(huì)被使用死相。
[root@lamp1 nginx]# mkdir /data/up1
[root@lamp1 nginx]# echo "<h1>backend server</h1>" > /data/up1/index.html
下一步融求,沿用前一小節(jié)的配置算撮,將其修改為一個(gè)代理服務(wù)器的配置生宛。在第一個(gè) locaiton 區(qū)塊中加入 proxy_pass 指令,指定后端服務(wù)器的:協(xié)議肮柜、主機(jī)名陷舅、端口(本例中疟呐,指定為 http://localhost:8080):
server {
location / {
proxy_pass http://localhost:8080/;
}
location /images/ {
root /data;
}
}
我們將修改第二個(gè) location 區(qū)塊谆吴,目前這個(gè) location 區(qū)塊將 URI 以 /images/ 起始的請(qǐng)求映射到 /data/images 目錄忍啤。將其修改為能夠匹配對(duì)于典型圖像文件的請(qǐng)求,這些圖像文件有典型的后綴名:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
在 “l(fā)ocation ~ \.(gif|jpg|png)$”
語(yǔ)句中汛兜, ~
表示使用正則表達(dá)式匹配柠逞,
正則表達(dá)式為:\.(gif|jpg|png)$
秽五。
這個(gè)正則表達(dá)式能夠匹配所有以 .gif, .jpg, .png
結(jié)尾的 URI聪廉。匹配的請(qǐng)求將被映射到 /data/images 目錄中。
當(dāng) nginx 選擇以哪個(gè) location 區(qū)塊匹配請(qǐng)求時(shí)酥馍,nginx 首先檢查指定了 prefix 前綴的 location 指令辩昆,
nginx 會(huì)記住被匹配的擁有最長(zhǎng) prefix 的 location 指令,然后開(kāi)始檢查正則表達(dá)式旨袒。
如果有一個(gè)正則表達(dá)式被匹配了汁针,nginx 會(huì)選擇這個(gè)正則表達(dá)式的 location,如果沒(méi)有正則表達(dá)式被匹配砚尽,它選擇之前記下的那個(gè)擁有最長(zhǎng)前綴的 location施无。
最終我們的配置文件是這樣的:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
nginx 服務(wù)器會(huì)過(guò)濾以 .gif, .jpg, .png
為結(jié)尾的 URI 的請(qǐng)求,將它們映射到 /data/images 目錄中(將 URI 添加到 root 指令的參數(shù)后面)必孤,并將其他請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器猾骡。
使新的配置生效,執(zhí)行 nginx -s reload
敷搪。
在另一個(gè) Linux 虛擬機(jī)中測(cè)試訪(fǎng)問(wèn):
[root@vm1 nginx]# curl http://192.168.0.171
<h1>backend server</h1>
在瀏覽器中訪(fǎng)問(wèn):
http://192.168.0.171/p1035007771.jpg
關(guān)于配置代理連接兴想,更深入的探討可參考:ngx_http_proxy_module
設(shè)置 FastCGI 代理
nginx 可用于將請(qǐng)求路由到 FastCGI 服務(wù)器,在 FastCGI 服務(wù)器上運(yùn)行著以各種框架和編程語(yǔ)言構(gòu)建的應(yīng)用赡勘,比如 PHP嫂便。
配置 nginx 與 FastCGI 服務(wù)器協(xié)同工作,最基礎(chǔ)的配置包括:使用 fastcgi_pass 指令替代 proxy_pass 指令闸与,并使用 fastcgi_param 指令設(shè)置傳遞給 FastCGI 服務(wù)器的參數(shù)毙替。
假設(shè) FastCGI 服務(wù)器可通過(guò) localhost:9000 訪(fǎng)問(wèn),我們以前面的配置為基礎(chǔ)践樱,首先將 proxy_pass 指令替換為 fastcgi_pass 指令蔚龙,指令參數(shù)修改為 localhost:9000。在 PHP 中映胁,SCRIPT_FILENAME 參數(shù)被用于決定腳本的名稱(chēng),QUERY_STRING 參數(shù)被用于傳遞請(qǐng)求參數(shù)甲雅。最終的配置如下:
server {
location / {
root /data/www;
fastcgi_index index.php;
fastcgi_pass localhost:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
通過(guò)這個(gè)配置[1]解孙,對(duì)于靜態(tài)圖形文件的請(qǐng)求由本地服務(wù)響應(yīng),除此之外的請(qǐng)求將通過(guò) FastCGI 協(xié)議被路由到工作于 localhost:9000 的服務(wù)器上抛人。
創(chuàng)建測(cè)試文件:
echo "<?php phpinfo(); ?>" >> /data/www/index.php
使用瀏覽器訪(fǎng)問(wèn) http://192.168.0.171
(這里替換為你的服務(wù)器 IP 地址)弛姜,即可看到 php 的測(cè)試頁(yè)面。
版權(quán)信息:
本文編譯自 nginx.org 妖枚,遵循其原來(lái)的 licence 聲明: 2-clause BSD-like license
-
譯者根據(jù)自己的測(cè)試情況廷臼,修改了該配置 ?