1. 程式人生 > 其它 >Nginx API 學習之一:初學者指南

Nginx API 學習之一:初學者指南

初學者指南

[nginx documentation][http://nginx.org/en/docs/]

目錄

1. 啟動、停止和重啟配置

通過執行可執行檔案啟動 nginx,一旦 nginx 已經啟動,可以通過呼叫可執行的帶 -s 引數進行控制,使用下面語法:

nginx -s signal

signal 可以使以下中的一個:

  • stop:快速停止
  • quit:溫和停止
  • reload:過載配置檔案
  • reopen:重啟日誌檔案

例如,若是等待工作程序完成當前請求的服務,再停止 nginx 程序,執行下面命令:

nginx -s quit

此命令執行前提是,同一個使用者啟動的 nginx 程序

修改配置檔案,使其生效,需要傳送過載配置訊號到 nginx,或是重啟 nginx 程序。過載配置檔案,執行:

nginx -s reload

一旦主程序收到過載配置訊號,會執行檢查新配置檔案語法的有效性,嘗試運用新檔案中的配置。如果成功,主程序啟動新的工作程序,併發送關閉訊息給舊的工作程序。否則,主程序回滾繼續使用舊的配置工作。舊的工作程序,接收到關閉命令後,停止接受新連線,並繼續服務當前請求直至服務完成,之後,舊的工作程序退出。

nginx 程序也會接收Unix工具發出的類似 kill 的訊號。這種情況下,訊號直接傳送到指定程序ID的程序,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

2. 配置檔案結構

nginx多個模組組成,這些模組由配置檔案中的具體指令控制。指令分為簡單指令和塊指令。一個簡單指令由名稱和引數組成,以空格區分並以英文分號(;)結尾。塊指令結構與簡單指令相同,但是不以英文分號結尾,塊指令由英文大括號包圍({和})。塊指令大括號內包含的其它指令,稱為內容(例如

events, http, server, 和 location

配置檔案中的指令,無論哪個上下文外層都應該在對應的 main中,eventshttpmain 內,serverhttp 內,locationserver 內。

# 開始的內容表示該行為註釋內容。

3. Serving靜態內容

web伺服器的一個重要任務是檔案服務(例如檔案或者靜態 HTML 網頁)。根據需求實現一個例子,檔案來源於本地不同目錄:/data/www(包含 HTML 檔案),/data/images(包含圖片檔案)。這將需要編輯配置檔案,在 http 塊內增加一個 server 塊,裡面包含2個 location 塊。

首先,建立目錄 /data/www,新增 index.html 檔案到該目錄,檔案中寫入一些內容。建立目錄 /data/images,存入一些圖片檔案。

其次,開啟配置檔案,配置檔案 server 塊中預設包含一些樣例,大部分是註釋掉的。現在註釋掉所有例子,重新開始編寫 server 塊。

http {
    server {
    }
}

通常來說,配置檔案中可能包括幾個 server 塊,通過監聽埠號和服務名稱來區分。一旦 Nginx 需要確定用哪一個 server 處理請求,通過匹配請求頭部資訊中 URI 資料與配置檔案 server 塊定義的 location 指令。

將下面的 location 塊新增到 server 塊:

location / {
    root /data/www;
}

上面 location 塊指定 “/” 與請求中的 URI 進行比較。為了匹配請求資料,請求路徑中需要加入 root 指令中定義的 URI 資訊,即 /data/www ,來組成請求的檔案在本地檔案系統的目錄。如果有多個匹配的 location 塊,Nginx 選擇字首最長的一個,上面的 location 提供了字首最短的一個,相對對於字首長的一個,所以,僅當其它的 location 都不匹配的時候,才使用最短的這個。

再次,新增第二個 location 塊:

location /images/ {
    root /data;
}

這個會匹配以 /images/ 開頭的請求(location / 也匹配這個請求,但是字首更短)。

最終的 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的錯誤。對於非以 /images/ 開頭的響應,Nginx 會匹配到 /data/www 目錄,例如,對於 http://localhost/some/example.html 請求,將傳送 /data/www/some/example.html 檔案。

使修改配置檔案生效,若是 Nginx 服務沒有啟動,則啟動服務,否則傳送 reload 訊號到 nginx 主程序,通過執行以下命令:

nginx -s reload

如果有些內容未達到期望效果,可以試著從日誌檔案 access.log 或 error.log 中查詢原因,檔案在目錄 /usr/local/nginx/logs 或 /var/log/nginx 中。

4. 建立一個簡單代理服務

nginx長作為一個代理伺服器使用,作為一個伺服器接收請求、轉至被代理的伺服器、從被代理伺服器返回響應併發送給客戶端。

我們來配置一個基本的代理伺服器,服務圖片請求,檔案來自本地目錄,其它請求傳送到一個代理伺服器。在這個例子中,伺服器和代理伺服器定義在一個 nginx 例項上。

首先,定義代理伺服器,通過在配置檔案中增加一個 server 塊,如下所示:

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

這是一個簡單的伺服器監聽8080埠(之前,自80端口占用之後,listen 指令還未被指定),並把所有請求匹配到 本地檔案系統的 /data/up1 目錄。建立這個目錄並放入 index.html 檔案。注意,root 指令放在 server 內,這個 root 指令在 請求匹配的location 塊中沒有 root 時使用。

其次,使用前面部分 server 配置,把它調整為一個代理伺服器。在一個 location 塊,新增 proxy_pass 指令,引數部分指定被代理伺服器的協議、名稱和埠號(我們這裡是 http://localhost:8080):

server {
    location / {
        proxy_pass http://localhost:8080;
    }
    location /images/ {
        root /data;
    }
}

我們將修改第二個 location 塊,當前匹配字首為 /images 的請求到 /data/images 目錄的檔案。為了使它匹配典型的檔案擴充套件請求,做如下調整:

location ~ \.(gif|jpg|png)$ {
    root /data/images;
}

引數是正則表示式來匹配所有以 .gif, .jpg 或 .png 結尾的URI,正則表示式以 ~ 開始。符合規則的請求將匹配到 /data/images 目錄。

nginx選擇 location 來匹配請求時,首先檢查 location 指令具體字首(記得是字首最長那一個),然後檢查正則表示式。如果正則表示式匹配,則選擇這個,否則,選擇最長字首那個。

代理伺服器最終配置如下所示:

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

此伺服器將過濾以 .gif, .jpg, 或 .png 結尾的請求,並匹配請求到 /data/images 目錄(通過增加 URI 到 root 引數),將其它所有請求轉至上面配置的代理伺服器。

使新配置生效,傳送 reload 訊號給 nginx,見上文。

配置代理伺服器更多指令見more

5. 建立 FastCGI 代理

nginx可以用於把請求路徑轉至 FastCGI 伺服器,提供不同框架的應用的執行和不同語言的程式設計(如 PHP)。

FastCGI 伺服器最基本配置包括使用 fastcgi_pass 指令代替 proxy_passfastcgi_param 指令設定引數傳輸至

FastCGI 服務。假設可以通過 localhost:9000 訪問 FastCGI 伺服器。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 將除了靜態圖片之外的所有請求傳輸至代理伺服器。