Nginx Beginner`s Guide

原文地址: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 下面。

執行、停止和重載配置

運行可執行的文件,就能開啟 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

一旦當主進程收到重載配置的指令,新配置文件中的語法合法性將會被檢查,新的配置也將被嘗試使用。如果成功,主進程將開啟新的子進程,并且給舊的子進程發送指令,關閉舊的子進程。如果新的配置失敗,主進程將會回滾,并且繼續使用舊的配置。舊的子進程會接收到指令,停止接收新的請求,在處理完當前請求后關閉。

在一些 unix 工具的幫助下,一些像 kill 這樣的指令也會被發送到 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

獲取更多關于發送指令給 nginx 的信息,請查看 Controlling Nginx

配置文件結構

nginx 由模塊組成,這些模塊通過配置文件中一些特定準則來進行控制。這些準則被劃分為單準則和準則塊。單準則由名字和參數組成,名字和參數之間通過空格進行區分,單準則以分號(;)結尾。準則塊和單準則具有相同的結構,但不同于分號,準則塊使用一堆花括號結尾({ })。如果一個準則塊內部包含了其他準則,這些準則被稱為 context(比:eventshttpserverlocation)。

Directives placed in the configuration file outside of any contexts are considered to be in the main context...

以井號(#)開始的行是注釋。

文件服務(serving static content)

WEB服務器很重要的一個功能就是提供文件服務(圖片,靜態HTML頁面)。下面將提供一個實例,這個實例將會根據請求,從服務器的不同目錄提供文件。(/data/www,HTML目錄,/data/images,圖片目錄)。為了完成這個實例,將需要修改配置文件,并將一個包含兩個 location塊 的 server塊 放置到 http塊 中。

首先,創建 /data/www 目錄,將 index.html(隨便寫點東西) 放到里面,然后再創建 /data/images 目錄,并往目錄里面塞一些圖片。

接下來,打開配置文件。默認的配置文件已經包含了一些 server塊 的示例,大部分以注釋的形式呈現。現在去掉 server塊 的注釋,并添加如下一個 server塊:

http {
server {
? }
}

總的來說,配置文件中可以包含很多 server塊,這些 server塊 通過監聽端口和服務名(server name)進行區分。一旦 nginx 決定了使用哪個 server 處理請求,nginx 將會拿到請求頭中的 URI 與server塊 中的 location準則塊 進行參數比較。

在上面的 server塊 中添加下列 location塊。

location / {
? root /data/www;
}

這個 location塊 指定了當請求中的 URI 以 “/” 為前綴的時候的 nginx 處理規則。如果請求匹配了規則,URI 將會添加到 root規則 中聲明的路徑,也就是說會從/data/www路徑獲取請求文件。如果 location塊 中有多個地方可以匹配請求的 URI,nginx 將選擇最長的那個。上面的 location塊 提供了最短的前綴,如果其他的 location塊 對URI的匹配都失敗了,這個最短的將會被使用。

接下來,添加第二個 location塊:

location /images/ {
? root /data/images;
}

這個規則將匹配以 /images/ 開始的請求(“/” 規則也可以匹配同樣請求,但 nginx 將選取最長的)。

最終的 server塊 將是下面這個樣子:

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

這就是一個在地址 http://localhost 監聽標準端口 80,可以生效的一個 server 配置。作為對以 /images/ 開頭請求 URI 的回應,服務器將會發送 /data/images 目錄的文件。比如,作為對 http://localhost/images/example.png 的回應,nginx 將會發送 /data/images/example.png 文件,如果不存在上述文件,nginx 將會發送一個 404。不以 /images/ 開頭的請求將會去匹配 /data/www 目錄。比如,作為對 http://localhost/some/exmaple.html 的回應,nginx 將發送 /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 作為一個獲取請求,轉發給被代理的服務器,從被代理的服務器獲取內容,然后轉發給客戶端的代理服務器。

接下來將配置一個基本的代理服務器,這個代理服務器將會從本地目錄獲取請求中的圖片,并將其他請求轉發給被代理的服務器。在這個例子中,兩個服務器都將是 nginx 服務器(both servers will be defined on a single nginx instance)。

首先,在被代理的服務器的配置中添加一個 server塊,內容如下:

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

這是一個監聽了 8080 端口的簡單服務器(如果標準 80 端口沒有被使用的話,這里是不用進行特別指定的),這個服務器將會去本地文件系統中的 /data/up1 目錄處理所有請求。創建 /data/up1 目錄,并放置 index.html。請注意 root 規則被放置到了 server 中。這種 root 規則將會在下面情況被使用,如果被匹配的 location塊 沒有自己的 root 規則。

接下來,使用之前的配置,并稍作修改就能使之成為一個代理服務器配置。在第一個 location塊 中,將被代理服務器的協議、名稱和端口號作為參數寫到 proxy_pass規則(這個例子中被代理的服務器時 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規則,記住最長的那個 location,然后才去匹配正則表達式的。如果有一個正則表達式匹配成功,nginx 將會選取這個 location,或者選取之前記住的那個。

最終的代理配置將會像下面這個樣子:

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

這個服務器將匹配以 .gif,.jpg,.png 結尾的請求,并將其 map 到 /data/images 目錄(通過在 root規則 中添加參數),同時將其他所有請求轉發到上面配置中被代理的服務器。

關于代理服務器配置,有以下更多規則可供參考。

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規則。fastcgi_param規則 可以為 FastCGI 服務器配置參數。假設可以通過 localhost:900 訪問 FastCGI 服務。使用之前的段落作為一個基本的代理配置,使用 fastcgi_pass 規則替代 proxy_pass規則,并且將參數更改為 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.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容

  • Nginx簡介 解決基于進程模型產生的C10K問題,請求時即使無狀態連接如web服務都無法達到并發響應量級一萬的現...
    魏鎮坪閱讀 2,021評論 0 9
  • 1.簡介: ? Nginx:engine X ,2002年,開源,商業版? http協議:web服務器(類似于ht...
    尛尛大尹閱讀 1,886評論 0 3
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,736評論 24 1,002
  • 1.ngnix介紹 ngnix www服務軟件 俄羅斯人開發 開源 性能很高 本身是一款靜態WWW軟件 靜態小文件...
    逗比punk閱讀 2,115評論 1 6
  • 感性和理性,卡布奇諾和紫菜湯的區別-再觀Pi&Life 當時,還是個陰雨天,江南的煙雨合著霧氣鋪面而來,這是一個新...
    尚物智閱讀 480評論 2 10