原文地址:Beginner`s Guide
參考文檔:Nginx原理
本文翻譯自上述地址(Nginx官網新手指引),我自己感覺到不能表達正確的地方使用了原文挠日,可能還存在其他我沒有意識到的轉述錯誤殿较,文章僅供參考箍邮。
入門手冊
這份手冊將給出關于 nginx 的一個基本指引挠唆,和一些基于這些指引可以完成的簡單應用。這份手冊將假設閱讀者現在已經安裝了 nginx今魔。如果沒有勺像,出門左轉。這份手冊將會描述 nginx 的啟動错森、停止吟宦、配置重載,解釋配置文件涩维,同時怎么應用 nginx 作文件服務殃姓,怎么將nginx 配置成一個代理服務器,怎么通過 FastCGI Application 連接 nginx瓦阐。
nginx 有一個主進程(master process)和若干個子進程(worker process)蜗侈。主進程的作用是為了方便對配置文件進行管理,同時可以管理子進程睡蟋。是子進程在真正的處理請求(nginx employs event-based model and os-dependent mechanisms to efficiently distribute requests among worker process踏幻,漏了翻譯這句),子進程的數量是在配置文件中定義的薄湿。
配置文件描述了 nginx 及其模塊的運行叫倍。一般情況下,配置文件叫做 nginx.conf豺瘤,被放置在目錄 /usr/local/nginx/conf吆倦,/etc/nginx,或者 /usr/local/etc/nginx 下面坐求。
執(zhí)行蚕泽、停止和重載配置
運行可執(zhí)行的文件,就能開啟 nginx(to start nginx, run the executeable file)桥嗤。一旦 nginx 被開啟须妻,就可以通過調用 -s 參數來控制 nginx,像下面這個樣子
nginx -s signal
signal 可以為:
- stop —— 快速關閉
- quit —— 安全關閉
- reload —— 重載配置
- reopen —— 重載日志
比如泛领,當一個子進程正在處理請求荒吏,而你想停止它,可以使用
nginx -s quit
該命令應該由開啟 nginx 的用戶下達渊鞋。
只有當 nginx 收到重載的指令后(或者 nginx 被重啟)绰更,之前配置文件中的修改才會生效。重載配置锡宋,使用
nginx -s reload
一旦當主進程收到重載配置的指令儡湾,新配置文件中的語法合法性將會被檢查,新的配置也將被嘗試使用执俩。如果成功徐钠,主進程將開啟新的子進程,并且給舊的子進程發(fā)送指令役首,關閉舊的子進程尝丐。如果新的配置失敗显拜,主進程將會回滾,并且繼續(xù)使用舊的配置摊崭。舊的子進程會接收到指令讼油,停止接收新的請求,在處理完當前請求后關閉呢簸。
在一些 unix 工具的幫助下矮台,一些像 kill 這樣的指令也會被發(fā)送到 nginx。在這種情況下根时,指令通過進程 id 直接作用于 nginx 進程瘦赫。默認情況下,nginx 的主進程 id 會被寫在 /usr/local/nginx/logs 或者 /var/run 目錄下的 nginx.pid 文件中蛤迎。例如确虱,假設主進程的 id 是 1628,使用 QUIT 命令可以進行安全的關閉
kill -s QUIT 1628
可以通過使用 ps 命令來查看正在運行的 nginx 進程替裆,比如
ps -ax | grep nginx
獲取更多關于發(fā)送指令給 nginx 的信息校辩,請查看 Controlling Nginx。
配置文件結構
nginx 由模塊組成辆童,這些模塊通過配置文件中一些特定準則來進行控制宜咒。這些準則被劃分為單準則和準則塊。單準則由名字和參數組成把鉴,名字和參數之間通過空格進行區(qū)分故黑,單準則以分號(;)結尾。準則塊和單準則具有相同的結構庭砍,但不同于分號场晶,準則塊使用一堆花括號結尾({ })。如果一個準則塊內部包含了其他準則怠缸,這些準則被稱為 context(比:events诗轻,http,server 和 location)揭北。
Directives placed in the configuration file outside of any contexts are considered to be in the main context...
以井號(#)開始的行是注釋扳炬。
文件服務(serving static content)
WEB服務器很重要的一個功能就是提供文件服務(圖片,靜態(tài)HTML頁面)罐呼。下面將提供一個實例,這個實例將會根據請求侦高,從服務器的不同目錄提供文件嫉柴。(/data/www,HTML目錄奉呛,/data/images计螺,圖片目錄)夯尽。為了完成這個實例,將需要修改配置文件登馒,并將一個包含兩個 location塊 的 server塊 放置到 http塊 中匙握。
首先,創(chuàng)建 /data/www 目錄陈轿,將 index.html(隨便寫點東西) 放到里面圈纺,然后再創(chuàng)建 /data/images 目錄,并往目錄里面塞一些圖片麦射。
接下來蛾娶,打開配置文件。默認的配置文件已經包含了一些 server塊 的示例潜秋,大部分以注釋的形式呈現』桌牛現在去掉 server塊 的注釋,并添加如下一個 server塊:
http {
server {
? }
}
總的來說峻呛,配置文件中可以包含很多 server塊罗售,這些 server塊 通過監(jiān)聽端口和服務名(server name)進行區(qū)分。一旦 nginx 決定了使用哪個 server 處理請求钩述,nginx 將會拿到請求頭中的 URI 與server塊 中的 location準則塊 進行參數比較寨躁。
在上面的 server塊 中添加下列 location塊。
location / {
? root /data/www;
}
這個 location塊 指定了當請求中的 URI 以 “/” 為前綴的時候的 nginx 處理規(guī)則切距。如果請求匹配了規(guī)則朽缎,URI 將會添加到 root規(guī)則 中聲明的路徑,也就是說會從/data/www
路徑獲取請求文件谜悟。如果 location塊 中有多個地方可以匹配請求的 URI话肖,nginx 將選擇最長的那個。上面的 location塊 提供了最短的前綴葡幸,如果其他的 location塊 對URI的匹配都失敗了最筒,這個最短的將會被使用。
接下來蔚叨,添加第二個 location塊:
location /images/ {
? root /data/images;
}
這個規(guī)則將匹配以 /images/ 開始的請求(“/” 規(guī)則也可以匹配同樣請求床蜘,但 nginx 將選取最長的)。
最終的 server塊 將是下面這個樣子:
server {
? lcation / {
? root /data/www;
? }
? location /images/ {
? root /data/images;
? }
}
這就是一個在地址 http://localhost 監(jiān)聽標準端口 80蔑水,可以生效的一個 server 配置邢锯。作為對以 /images/ 開頭請求 URI 的回應,服務器將會發(fā)送 /data/images 目錄的文件搀别。比如丹擎,作為對 http://localhost/images/example.png 的回應,nginx 將會發(fā)送 /data/images/example.png 文件,如果不存在上述文件蒂培,nginx 將會發(fā)送一個 404再愈。不以 /images/ 開頭的請求將會去匹配 /data/www 目錄。比如护戳,作為對 http://localhost/some/exmaple.html 的回應翎冲,nginx 將發(fā)送 /data/www/some/example.html 文件。
想要讓新的配置生效媳荒,如果沒有開啟 nginx抗悍,那就開啟 nginx,或者再開啟了 nginx 的情況下使用 nginx -s reload
肺樟。
當結果并沒有像期待的那樣時檐春,你可以去 /usr/local/nginx/logs 或者 /var/log/nginx 目錄中的 access.log 和 error.log 文件尋找原因。
簡單代理服務(setting up a simple proxy server)
ngixn 的一個廣泛用途是作為一個代理服務器么伯,這意味著 nginx 作為一個獲取請求疟暖,轉發(fā)給被代理的服務器,從被代理的服務器獲取內容田柔,然后轉發(fā)給客戶端的代理服務器俐巴。
接下來將配置一個基本的代理服務器,這個代理服務器將會從本地目錄獲取請求中的圖片硬爆,并將其他請求轉發(fā)給被代理的服務器欣舵。在這個例子中,兩個服務器都將是 nginx 服務器(both servers will be defined on a single nginx instance)缀磕。
首先缘圈,在被代理的服務器的配置中添加一個 server塊,內容如下:
server {
? listen 8080;
? root /data/up1;
? location / {
? }
}
這是一個監(jiān)聽了 8080 端口的簡單服務器(如果標準 80 端口沒有被使用的話袜蚕,這里是不用進行特別指定的)糟把,這個服務器將會去本地文件系統(tǒng)中的 /data/up1 目錄處理所有請求。創(chuàng)建 /data/up1 目錄牲剃,并放置 index.html遣疯。請注意 root 規(guī)則被放置到了 server 中。這種 root 規(guī)則將會在下面情況被使用凿傅,如果被匹配的 location塊 沒有自己的 root 規(guī)則缠犀。
接下來,使用之前的配置聪舒,并稍作修改就能使之成為一個代理服務器配置辨液。在第一個 location塊 中,將被代理服務器的協(xié)議箱残、名稱和端口號作為參數寫到 proxy_pass規(guī)則(這個例子中被代理的服務器時 http://localhost:8080):
server {
? location / {
? proxy_pass http://localhost:8080;
? }
? location /images/ {
? root /data/images;
? }
}
我們將修改當前從 /data/images/ 目錄匹配 /images/ 前綴第二個 location塊滔迈,使之可以匹配常見圖片后綴觉吭,像下面這樣:
location ~ \.(gif|jpg|png)$ {
? root /data/images;
}
這是一個用來匹配以 .gif蜓耻,.jpg浊仆,.png 結尾的 URI 的常用表達蜂奸。一個常用的表達應該使用 ~ 開頭谤狡。被匹配的請求將會到 /data/images 目錄皇耗。
當 nginx 選擇一個 location塊 來處理請求時法竞,首先會檢查可以匹配請求 URI 的 location規(guī)則退疫,記住最長的那個 location榜揖,然后才去匹配正則表達式的勾哩。如果有一個正則表達式匹配成功,nginx 將會選取這個 location举哟,或者選取之前記住的那個思劳。
最終的代理配置將會像下面這個樣子:
server{
? location / {
? proxy_pass http://localhost:8080/;
? }
? location ~ \.(gif|jpg|png)$ {
? root /data/images;
? }
}
這個服務器將匹配以 .gif,.jpg妨猩,.png 結尾的請求潜叛,并將其 map 到 /data/images 目錄(通過在 root規(guī)則 中添加參數),同時將其他所有請求轉發(fā)到上面配置中被代理的服務器壶硅。
關于代理服務器配置威兜,有以下更多規(guī)則可供參考。
FastCGI 代理配置
ngixn 可以用來為很多建立在不同框架和語言(比如PHP)的 FastCGI 應用提供 route requests庐椒。(nginx can be used to route requests to FastCGI servers which run applications built with various frameworks and programming laguages such as PHP)椒舵。
nginx 作為一個 FastCGI 服務器時最基本的配置包括 fastcgi_pass規(guī)則。fastcgi_param規(guī)則 可以為 FastCGI 服務器配置參數约谈。假設可以通過 localhost:900 訪問 FastCGI 服務笔宿。使用之前的段落作為一個基本的代理配置,使用 fastcgi_pass 規(guī)則替代 proxy_pass規(guī)則棱诱,并且將參數更改為 localhost:9000泼橘。在PHP中,參數 SCRITP_FILENAME 用來決定腳本名稱军俊,QUERY_STRING 參數用來通過請求參數侥加。最后的配置如下:
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;
? }
}
This will set up a server that will route all requests except for requests for static images to the proxied server operating on localhost:9000 througn the FastCGI protocol.