入門指南
啟動、停止和重新載入組態 組態檔案的結構 提供靜態內容 設定簡單的代理伺服器 設定 FastCGI 代理 |
本指南將基本介紹 nginx,並說明一些可以使用它完成的簡單任務。假設讀者的機器上已經安裝了 nginx。如果沒有,請參閱安裝 nginx頁面。本指南說明如何啟動和停止 nginx,以及重新載入其組態,解釋組態檔案的結構,並說明如何設定 nginx 以提供靜態內容、如何將 nginx 設定為代理伺服器,以及如何將其與 FastCGI 應用程式連接。
nginx 有一個主程序和幾個工作程序。主程序的主要目的是讀取和評估組態,並維護工作程序。工作程序會實際處理請求。nginx 採用基於事件的模型和與作業系統相關的機制,以有效地在工作程序之間分配請求。工作程序的數量在組態檔案中定義,可以為給定的組態固定,或自動調整為可用的 CPU 核心數量(請參閱worker_processes)。
nginx 及其模組的運作方式在組態檔案中決定。預設情況下,組態檔案名為 nginx.conf
,並放置在目錄 /usr/local/nginx/conf
、/etc/nginx
或 /usr/local/etc/nginx
中。
啟動、停止和重新載入組態
要啟動 nginx,請執行可執行檔案。一旦 nginx 啟動,就可以透過使用 -s
參數呼叫可執行檔案來控制它。使用以下語法
nginx -s signal
其中signal可以是以下其中之一
-
stop
— 快速關閉 -
quit
— 優雅關閉 -
reload
— 重新載入組態檔案 -
reopen
— 重新開啟記錄檔
例如,要停止 nginx 程序並等待工作程序完成服務目前請求,可以執行以下命令
nginx -s quit
此命令應以啟動 nginx 的相同使用者身分執行。
在組態檔案中所做的變更,在將重新載入組態的命令傳送到 nginx 或重新啟動之前,不會套用。要重新載入組態,請執行
nginx -s reload
一旦主程序收到重新載入組態的訊號,它會檢查新組態檔案的語法有效性,並嘗試套用其中提供的組態。如果成功,主程序會啟動新的工作程序,並向舊的工作程序傳送訊息,請求它們關閉。否則,主程序會回溯變更並繼續使用舊組態。舊的工作程序在收到關閉命令後,會停止接受新的連線,並繼續為目前的請求提供服務,直到所有此類請求都已處理完畢。之後,舊的工作程序會退出。
也可以使用 Unix 工具(例如 kill
公用程式)向 nginx 程序傳送訊號。在這種情況下,訊號會直接傳送到具有指定程序 ID 的程序。預設情況下,nginx 主程序的程序 ID 會寫入目錄 /usr/local/nginx/logs
或 /var/run
中的 nginx.pid
。例如,如果主程序 ID 為 1628,要傳送導致 nginx 優雅關閉的 QUIT 訊號,請執行
kill -s QUIT 1628
要取得所有執行中的 nginx 程序清單,可以使用 ps
公用程式,例如,以下方式
ps -ax | grep nginx
如需更多有關將訊號傳送到 nginx 的資訊,請參閱控制 nginx。
組態檔案的結構
nginx 由模組組成,這些模組由在組態檔案中指定的指令控制。指令分為簡單指令和區塊指令。簡單指令由名稱和參數組成,以空格分隔,並以分號 (;
) 結尾。區塊指令的結構與簡單指令相同,但不是以分號結尾,而是以一組用大括號 ({
和 }
) 包圍的其他指令結尾。如果區塊指令可以在大括號內有其他指令,則稱為上下文(範例:events、http、server 和 location)。
放置在組態檔案中任何上下文之外的指令,都被視為在main上下文中。events
和 http
指令位於 main
上下文中,server
位於 http
中,而 location
位於 server
中。
#
符號後的行餘下部分都被視為註解。
提供靜態內容
一個重要的網頁伺服器任務是提供檔案(例如影像或靜態 HTML 頁面)。您將實作一個範例,其中根據請求,檔案將從不同的本機目錄提供:/data/www
(可能包含 HTML 檔案)和 /data/images
(包含影像)。這將需要編輯組態檔案,並在 http 區塊內設定一個 server 區塊,其中包含兩個 location 區塊。
首先,建立 /data/www
目錄,並在其中放入具有任何文字內容的 index.html
檔案,然後建立 /data/images
目錄,並在其中放入一些影像。
接下來,開啟組態檔案。預設組態檔案已包含幾個 server
區塊範例,大多數已註解掉。現在請註解掉所有此類區塊,並啟動新的 server
區塊
http { server { } }
一般而言,組態檔案可以包含多個 server
區塊,這些區塊會依它們接聽的連接埠和伺服器名稱進行區分。一旦 nginx 決定哪個 server
處理請求,它就會根據在 server
區塊內定義的 location
指令的參數,測試在請求標頭中指定的 URI。
將以下 location
區塊新增到 server
區塊
location / { root /data/www; }
此 location
區塊會指定與請求中 URI 比較的「/
」前置詞。對於相符的請求,URI 會新增到 root 指令中指定的路徑(也就是 /data/www
),以形成本機檔案系統上所請求檔案的路徑。如果有數個相符的 location
區塊,nginx 會選取具有最長前置詞的區塊。上面的 location
區塊提供最短的前置詞,長度為一,因此只有在所有其他 location
區塊都無法提供符合項時,才會使用此區塊。
接下來,新增第二個 location
區塊
location /images/ { root /data; }
它將與以 /images/
開頭的請求相符(location /
也會與此類請求相符,但具有較短的前置詞)。
server
區塊的結果組態應如下所示
server { location / { root /data/www; } location /images/ { root /data; } }
這已經是一個可運作的伺服器組態,它在標準連接埠 80 上接聽,並且可以在本機的 https://127.0.0.1/
上存取。為了回應以 /images/
開頭的 URI 的請求,伺服器會從 /data/images
目錄傳送檔案。例如,為了回應 https://127.0.0.1/images/example.png
請求,nginx 會傳送 /data/images/example.png
檔案。如果此類檔案不存在,nginx 會傳送指出 404 錯誤的回應。沒有以 /images/
開頭的 URI 的請求,會對應到 /data/www
目錄。例如,為了回應 https://127.0.0.1/some/example.html
請求,nginx 會傳送 /data/www/some/example.html
檔案。
要套用新的組態,請啟動 nginx(如果尚未啟動),或將 reload
訊號傳送到 nginx 的主程序,方法是執行
nginx -s reload
如果出現任何未如預期般運作的問題,您可以嘗試在目錄/usr/local/nginx/logs
或/var/log/nginx
中的access.log
和error.log
檔案中找出原因。
設定簡單的代理伺服器
nginx 的常見用途之一是將其設定為代理伺服器,這表示一個接收請求、將請求傳遞到代理伺服器、從它們擷取回應並將其傳送到用戶端的伺服器。
我們將設定一個基本的代理伺服器,該伺服器使用本機目錄中的檔案服務影像請求,並將所有其他請求傳送到代理伺服器。在本範例中,這兩個伺服器都將在單一 nginx 執行個體上定義。
首先,將另一個 server
區塊新增到 nginx 的組態檔案,並包含以下內容,以定義代理伺服器
server { listen 8080; root /data/up1; location / { } }
這將是一個簡單的伺服器,它在連接埠 8080 上接聽(先前,由於使用標準連接埠 80,因此未指定 listen
指令),並將所有請求對應到本機檔案系統上的 /data/up1
目錄。建立此目錄,並將 index.html
檔案放入其中。請注意,root
指令放置在 server
上下文中。當選取用於服務請求的 location
區塊未包含自己的 root
指令時,會使用此類 root
指令。
接下來,使用上一節中的伺服器組態,並修改它以使其成為代理伺服器組態。在第一個 location
區塊中,放入 proxy_pass 指令,其中包含在參數中指定的代理伺服器通訊協定、名稱和連接埠(在我們的案例中,為 https://127.0.0.1:8080
)
server { location / { proxy_pass https://127.0.0.1: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 指令,記住具有最長前置詞的 location
,然後檢查規則運算式。如果規則運算式有符合項,nginx 會選取此 location
;否則,它會選取先前記住的那個。
代理伺服器的結果組態將如下所示
server { location / { proxy_pass https://127.0.0.1:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
此伺服器會篩選以 .gif
、.jpg
或 .png
結尾的請求,並將它們對應到 /data/images
目錄(透過將 URI 新增到 root
指令的參數),並將所有其他請求傳遞到上面設定的代理伺服器。
若要套用新的組態,請依照先前章節所述將 reload
訊號傳送到 nginx。
還有許多更多指令可以用來進一步設定代理連線。
設定 FastCGI 代理
nginx 可以用來將請求路由到 FastCGI 伺服器,這些伺服器運行使用各種框架和程式語言(如 PHP)構建的應用程式。
要與 FastCGI 伺服器搭配使用的最基本 nginx 設定,包括使用 fastcgi_pass 指令取代 proxy_pass
指令,並使用 fastcgi_param 指令來設定傳遞給 FastCGI 伺服器的參數。假設 FastCGI 伺服器可透過 localhost:9000
存取。以前一節的代理設定為基礎,將 proxy_pass
指令替換為 fastcgi_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
上運作的代理伺服器。