Nginx 新手村
某位天皇巨星曾經說過:信心比黃金更重要。深以為然,我們學習一門技術,首要的是要對其建立信心。如何建立信心?沒有什麼比拿到一個能跑起來的例子更能建立起堅挺的信心了。
對於 Nginx,官方的入門文件還不錯。今天就讓我們一起學習一下 Nginx 官網的新手指南。
以下為 Google 翻譯 + 人工校正的結果。
本指南給出了對 nginx 的基本介紹,並描述了一些 nginx 能做的簡單任務。我們假設你已經安裝好了 nginx,如果沒有,請參閱安裝頁面。本指南介紹如何啟動和停止 nginx、重新載入配置,說明配置檔案的結構,並介紹如何通過設定 nginx 提供靜態內容,如何將 nginx 配置為代理伺服器,以及如何將 nginx 連線到一個 FastCGI 應用程式。
Nginx 有一個 master 程序和幾個 worker 程序。Master 程序的主要目的是讀取和評估配置,並維護 worker 程序。Worker 程序對請求進行實際處理。Nginx 使用基於事件的模型和依賴於作業系統的機制來高效地在 worker 程序間分配請求。Worker 程序的數量在配置檔案中定義,在給定的配置中可能已經設定為一個固定值,或者自動調整為和可用 CPU 核心數一樣的數值(請參閱 worker_processes)。
配置檔案規定了 nginx 及其各模組的工作模式。預設情況下,配置檔名稱為 nginx.conf,存放路徑為 /usr/local/nginx/conf 或 /etc/nginx 或 /usr/local/etc/nginx。
Starting, Stopping, and Reloading Configuration
首先通過執行可執行檔案來啟動 nginx,如 sudo /etc/init.d/nginx start/stop/restart
。啟動之後,所有的控制就可以通過 nginx -s <signal>
來進行。
Signal 可以是這幾個值:
+ stop —— 快速關閉
+ quit —— 正常關閉
+ reload —— 過載配置檔案
+ reopen —— 重新開啟日誌檔案
例如,要等待 worker 程序處理完當前請求後再停止 nginx,就執行這條命令:
nginx -s quit # 應使用啟動 nginx 的使用者來執行
更改配置檔案之後,需要重新載入配置或重啟 nginx 才會生效。過載配置命令為:
nginx -s reload
一旦 master 程序接收到重新載入配置的訊號,它將檢查新配置檔案的語法有效性,並嘗試應用其中提供的配置。如果成功,則 master 程序啟動新的 worker 程序,併發送訊息給舊 worker 程序,請求關閉程序。否則,master 程序回滾更改並繼續使用舊配置。舊 worker 程序接收到關閉命令,則停止接受新的連線,並繼續服務當前的請求,直到服務完畢,舊 worker 程序才退出。
也可以通過 Unix 工具發訊號給 nginx 程序,比如 kill。在這種情況下,訊號直接傳送給具有給定程序 ID 的程序。Nginx master 程序的程序 ID 預設寫入 /usr/local/nginx/logs 或 /var/run 下的 nginx.pid 檔案中。例如,如果 master 程序 ID 是1628,要傳送 QUIT 訊號來關閉 nginx ,執行:
kill -s QUIT 1628
可以通過 ps 命令來獲取到所有執行中的 nginx 程序。
ps -ax | grep nginx
關於傳送 signal 給 nginx 的更詳細內容,請檢視 Controlling nginx。
Configuration File’s Structure
Nginx 包含在配置檔案中指定的指令控制的模組。指令分為簡單指令和塊指令。簡單指令由用空格分隔的名稱和引數組成,並以分號(;)結束。塊指令與簡單指令有相同的結構,但不是以分號結束,而是以一系列由大括號({和})包圍的附加指令結束。如果一個塊指令在大括號內可以有其他的指令,它就被稱為一個上下文(例如:events,http,server 和 location)。
配置檔案中處於任何上下文之外的指令被認為是在主上下文中。event 和 http 指令在主上下文中,server 在 http 上下文中,而 location 在 server 上下文中。
一行中 # 之後的部分為註釋。
Serving Static Content
一個重要的 Web 伺服器功能是提供檔案(如影象或靜態 HTML 頁面)。下面實現一個示例,根據請求從不同的本地目錄中提供檔案: /data/www(可能包含 HTML 檔案)和 /data/images(包含影象)。這需要修改配置檔案,在 http 塊中新增一個包含兩個 location 塊的 server 塊。
首先,建立 /data/www 目錄,放一個包含了任意文字內容的 index.html 檔案在裡面,建立 /data/images 目錄,放一些圖片在裡面。
然後,修改配置檔案。配置檔案中預設已經包含了一些被註釋掉的樣例 server 塊。註釋掉所有的 server 塊,新建一個我們自己的:
http {
server {
}
}
一般來說,配置檔案可能包含幾個 server 塊,這些 server 塊通過不同的偵聽埠和名稱來區分。一旦 nginx 決定哪個 server 塊處理請求,就會根據 server 塊內定義的位置指令的引數來匹配請求頭中指定的 URI。
新增以下的 location 塊到 server 塊中:
location / {
root /data/www;
}
該 location 塊使用 / 與請求中的 URI 進行比較。為了匹配請求,URI 將被拼接到根指令中指定的路徑後,即 /data/www 後面,以形成本地檔案系統上所請求檔案的路徑。如果有幾個匹配的 location 塊,nginx 會選擇最長的字首。上面的 location 塊提供了最短的字首,長度為1,所以只有當所有其他 location 塊都不能提供匹配時,才會使用這個塊。
接著新增第二個 location 塊:
location /images/ {
root /data;
}
該 location 塊 匹配以 /images/ 開始的請求(location / 也可以匹配,但它比 /images/ 要短)。
最後 server 塊的配置就是這樣:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
這已經是一個在標準80埠上偵聽的伺服器的工作配置,可以在本地機器上訪問http://localhost/。為了響應以 /images/ 開頭的 URI 的請求,伺服器將從 /data/images 目錄傳送檔案。例如,為了響應 http://localhost/images/example.png 請求,nginx 會發送 /data/images/example.png 檔案。如果這樣的檔案不存在,nginx 會發送一個指示404錯誤的響應。 URI 不以 /images/ 開頭的請求將被對映到 /data/www 目錄。例如,為了響應 http://localhost/some/example.html 請求,nginx 將傳送 /data/www/some/example.html 檔案。
現在,過載配置檔案以使我們的配置生效,如果 nginx 還沒有啟動,啟動即可生效。
nginx -s reload
如果 nginx 沒有按我們的設想工作,可以通過 access.log 和 error.log 查詢原因,兩個日誌檔案路徑為 /usr/local/nginx/logs 或 /var/log/nginx。
Setting Up a Simple Proxy Server
Nginx 常被用作代理伺服器,這意味著 nginx 伺服器接收請求並轉發給被代理的伺服器,然後從被代理的伺服器獲取響應轉發給客戶端。
我們將配置一個基本的代理伺服器,為影象請求返回本地目錄的檔案,並將其他請求轉發給被代理的伺服器。在這個例子中,我們在一個 nginx 例項上定義這兩個伺服器。
首先,通過在配置檔案中新增一個 server 塊來定義被代理的伺服器:
server {
listen 8080;
root /data/up1;
location / {
}
}
這是一個簡單的偵聽埠8080的伺服器(以前,因為使用標準埠80,listen 指令沒有被指定),並將所有請求對映到本地檔案系統上的 /data/up1 目錄。建立這個目錄,並把 index.html 檔案放進去。請注意,root 路徑放置在 server 上下文中。當選中用於響應請求的 location 塊沒有自己的根路徑時,使用這個根路徑。
接下來,使用上一節中的 server 配置並對其進行修改,使其成為代理伺服器配置。在第一個 location 塊中,將 proxy_pass 指令與引數中指定的代理伺服器協議、名稱和埠(在本例中為 http://localhost:8080)相加:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我們將修改第二個 location 塊,該塊當前使用 /images/ 字首將請求對映到 /data/images 目錄下的檔案,以使其與具有典型副檔名的影象請求匹配。修改後的 location 塊如下所示:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
該引數是一個匹配以 .gif,.jpg 或 .png 結尾的所有 URI 的正則表示式。這裡正則表示式應該以〜開頭。相應的請求將被對映到 /data/images 目錄。
當 nginx 選擇一個 location 塊來提供請求服務時,它首先檢查指定字首的 location 指令,記住最長字首的位置,然後檢查正則表示式。如果與正則表示式匹配,nginx 選擇這個 location ,否則,選擇一個早先記住的 location。
最終的代理伺服器配置如下:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
此伺服器將過濾以 .gif,.jpg 或 .png 結尾的請求,並將它們對映到 /data/images 目錄(通過將 URI 新增到 root 指令的引數後面),並將所有其他請求傳遞到上面配置的被代理伺服器。
過載配置檔案,以應用代理配置。
還有更多的指令可以被應用到代理伺服器配置中。
Setting Up FastCGI Proxying
Nginx 可將請求路由到執行著由各種框架和程式語言(如 PHP )構建的應用程式的 FastCGI 伺服器。
使用 FastCGI 伺服器的最基本的 nginx 配置包括使用 fastcgi_pass 指令而不是 proxy_pass 指令,以及 fastcgi_param 指令來設定傳遞給 FastCGI 伺服器的引數。假設 FastCGI 伺服器可以在 localhost:9000 上訪問。以前面的代理配置為基礎,用 fastcgi_pass 指令替換 proxy_pass 指令,並將引數更改為 localhost:9000。在 PHP 中,SCRIPT_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;
}
}
應用了該配置的伺服器將把除了圖片請求以外的請求通過 FastCGI 協議路由到被代理的伺服器(這裡是 localhost:9000)。