NGINX 作為常用的 Web 伺服器和反向代理伺服器,其效能和穩定性仰賴於正確的設定。HTTP 核心模組提供了許多指令,控制 NGINX 如何處理請求、管理資源和回應客戶端。理解這些指令的運作機制,才能有效地調校伺服器,達到最佳效能和安全性。本文將探討一些關鍵的 HTTP 核心模組指令,並結合實務上的應用案例進行分析,例如設定客戶端請求體緩衝區大小 (client_body_buffer_size) 來最佳化大型檔案上傳,以及設定請求超時時間 (client_body_timeout) 來避免資源浪費。此外,文章也涵蓋了請求頭處理、MIME 型別設定、檔案處理、快取機制、許可權控制和速率限制等重要議題,並提供相關指令的設定範例和技術選型建議,讓讀者能更有效地運用 NGINX。

NGINX HTTP 核心模組指令探討

NGINX 作為一款高效能的 Web 伺服器,其 HTTP 核心模組提供了多種指令來控制伺服器的行為。這些指令涵蓋了諸如處理客戶端請求、管理資源、處理錯誤等多個方面。以下將探討一些關鍵的 HTTP 核心模組指令,並結合實務經驗進行分析。

客戶端請求體緩衝區

client_body_buffer_size

client_body_buffer_size 指令用於設定客戶端請求體緩衝區的大小。當請求體超過這個大小時,NGINX 會將其寫入磁碟。這對於處理大型上傳檔案非常重要。

語法:

client_body_buffer_size Size value;

預設值: 8k 或 16k(取決於電腦架構)

應用案例: 如果你的應用程式允許使用者上傳大型檔案,可以適當增加這個值以避免頻繁寫入磁碟,從而提升效能。例如:

client_body_buffer_size 32k;

client_body_temp_path

client_body_temp_path 指令用於設定客戶端請求體檔案的臨時路徑。可以選擇分層目錄結構來組織這些檔案。

語法:

client_body_temp_path path [level1] [level2] [level3];

預設值: client_body_temp

應用案例: 如果你希望將上傳的檔案分散到不同的目錄以提升效能和管理方便,可以設定多層目錄結構。例如:

client_body_temp_path /tmp/nginx_rbf 1 2;

處理客戶端請求超時

client_body_timeout

client_body_timeout 指令用於設定讀取客戶端請求體的不活動超時時間。當客戶端停止傳輸資料超過這個時間後,NGINX 會傳回 408 Request timeout 錯誤。

語法:

client_body_timeout Time value;

預設值: 60 秒

應用案例: 如果你希望避免長時間的空閒連線佔用伺服器資源,可以適當減少這個時間。例如:

client_body_timeout 30;

處理客戶端請求頭

client_header_buffer_size

client_header_buffer_size 指令用於設定 NGINX 用於儲存客戶端請求頭的緩衝區大小。通常,1k 已經足夠,但在某些情況下(如請求 URI 過長或 Cookie 資料過多)可能需要增加。

語法:

client_header_buffer_size Size value;

預設值: 1k

應用案例: 如果你發現某些請求因為請求頭過大而導致問題,可以增加這個值。例如:

client_header_buffer_size 2k;

large_client_header_buffers

large_client_header_buffers 指令用於設定在請求頭超過預設緩衝區大小時使用的緩衝區數量和大小。每一行頭部資訊必須適合單個緩衝區,否則會傳回錯誤。

語法:

large_client_header_buffers amount size;

預設值: 4*8 kilobytes

應用案例: 如果你發現有很多長頭部資訊的請求,可以適當增加這些緩衝區的數量和大小。例如:

large_client_header_buffers 8 16k;

處理客戶端請求體超出限制

client_max_body_size

client_max_body_size 指令用於設定客戶端請求體的最大允許大小。超過這個大小時,NGINX 會傳回 413 Request entity too large 錯誤。

語法:

client_max_body_size Size value;

預設值: 1m

應用案例: 如果你希望限制上傳檔案的大小以避免伺服器負載過重,可以適當減少這個值。例如:

client_max_body_size 500k;

延遲關閉連線

lingering_time 和 lingering_timeout

這兩個指令與延遲關閉連線有關。當 NGINX 接收到超過 max_client_body_size 的資料時,會立即傳回錯誤回應並等待 lingering_time 時間後再關閉連線。在這段時間內,NGINX 不會讀取任何資料,僅在需要時進行讀取。

  • lingering_time 的語法和預設值:
    lingering_time Time value;
    
    預設值: 30 seconds
  • lingering_timeout 的語法和預設值:
    lingering_timeout Time value;
    
    預設值: 5 seconds

忽略無效頭部資訊

ignore_invalid_headers

ignore_invalid_headers 指令控制 NGINX 是否忽略無效的請求頭部資訊。如果停用此指令,NGINX 則會傳回400 Bad Request 錯誤。

語法:

ignore_invalid_headers on | off;

預設值: on(忽略無效頭部資訊)

分塊傳輸編碼

chunked_transfer_encoding

此指令啟用或停用對 HTTP/1.1 請求的分塊傳輸編碼。

語法:

chunked_transfer_encoding on | off;

預設值: on(啟用)

支援範圍範圍查詢

max_ranges

此指令定義了 NGINX 在一次查詢中可以提供多少位元組範圍給客戶端。

  • 語法

    max_ranges Numeric value;
    
  • 應用場景:在媒體流式傳輸或部分內容下載時特別有幫助。

MIME型別組態

types 和 default_type

  • types

    • 用來定義副檔名與MIME型別之間的關聯。
    • 語法
      types {
          mime-type extension [extension...];
          ...
      }
      
  • default_type

    • 用來定義沒有明確MIME型別情況下預設使用哪種MIME型別。
    • 語法
      default_type mime-type;
      

論述與技術選擇建議

在實際操作中,這些組態引數如何選擇和調整需要根據具體業務需求進行分析。

  • 對於高頻率、大量檔案上傳場景,需要適當增大 client_max_body_sizeclient_body_buffer_size
  • 對於動態生成內容或需要部分內容查詢(如媒體流)情況下,啟用和調整 max_ranges 組態將會非常重要。
  • 在處理異常情況或防範 DDoS 攻擊時,合理調整超時和延遲關閉組態將會提升系統穩定性。

在實務中通常選擇經驗組態引數作為基礎調整點(如上述示例),並根據實際監控資料進行進一步最佳化。 總結來說,深入理解並合理組態 NGINX HTTP 模組是提升伺服器效能及可靠性的重要手段之一。 透過這些指令和組態引數,能夠更靈活地處理各種網路請求和資源管理需求,從而達到更好的營運效果和使用者經驗。

探索 Nginx HTTP Core 模組指令

在 Nginx 的 HTTP core 模組中,有許多指令可以控制伺服器如何處理請求和回應。這些指令涵蓋了從 MIME 型別設定到速率限制等多個方面。以下將詳細探討這些指令的用法及其應用場景。

MIME 型別與檔案處理

檔案型別設定

Nginx 使用 mime.types 檔案來定義不同檔案副檔名對應的 MIME 型別。這個檔案通常已經包含了大多數常見的檔案型別,因此通常不需要修改它。如果伺服器需要提供的檔案型別不在列表中,則會使用 default_type 指令所定義的預設型別。

http {
    include mime.types;
    [...]
    location /downloads/ {
        # 清除所有 MIME 型別
        types { }
        default_type application/octet-stream;
    }
    [...]
}

在這個例子中,/downloads/ 路徑下的所有檔案都會被強制下載,而不會被瀏覽器直接顯示。

MIME 型別與瀏覽器行為

有些瀏覽器可能會忽略 MIME 型別,並根據檔案名稱的副檔名來決定如何處理檔案。為了確保檔案處理方式更加確定,可以使用 add_header 指令來新增 Content-Disposition 標頭,詳細說明請參考 HTTP 標頭模組。

預設 MIME 型別

如果沒有包含 mime.types 檔案,Nginx 會使用以下預設的 MIME 型別:

types {
    text/html html;
    image/gif gif;
    image/jpeg jpg;
}
default_type text/plain;

這些預設值可以根據需求進行修改。

許可權控制與速率限制

點控 HTTP 方法

limit_except 指令可以限制特定路徑下允許的 HTTP 方法。例如,可以禁止對 /admin/ 路徑的 POST 請求:

location /admin/ {
    limit_except GET {
        allow 192.168.1.0/24;
        deny all;
    }
}

這段組態表示只有來自 192.168.1.0/24 網段的客戶端可以使用 GET 方法存取 /admin/ 路徑,其他所有客戶端都會收到 403 Forbidden 錯誤。

控制傳輸速率

limit_rate 指令可以限制單個客戶端連線的傳輸速率:

limit_rate 500k;

這表示每個連線的傳輸速率限制為每秒 500 千位元組。如果一個客戶端開啟了兩個連線,則總傳輸速率為每秒 1000 千位元組。

limit_rate_after 指令則定義在啟用速率限制之前可以傳輸多少資料:

limit_rate_after 10m;

這表示前 10 墨位元組的資料傳輸不受速率限制,超過這個大小後才會啟用速率限制。

條件滿足與內部路徑

條件滿足

satisfy 指令定義了客戶端是否需要滿足所有條件或至少一個條件才能存取資源:

location /admin/ {
    allow 192.168.1.0/24;
    deny all;
    auth_basic "Authentication required";
    auth_basic_user_file conf/htpasswd;
}

如果設定為 satisfy any,則客戶端只要滿足其中一個條件就能存取;如果設定為 satisfy all,則客戶端需要同時滿足所有條件。

內部路徑

internal 指令指定一個路徑為內部路徑,這樣該資源就無法被外部請求存取:

server {
    [...]
    server_name .website.com;
    location /admin/ {
        internal;
    }
}

這段組態表示 /admin/ 路徑只能透過內部重定向存取,外部請求將收到 404 Not Found 錯誤。

許可權控制指令細節

Nginx 的許可權控制指令通常用來限制特定路徑或資源的存取許可權。以下是一些常見的許可權控制指令:

  • allow:允許特定 IP 或網段存取。
  • deny:拒絕特定 IP 或網段存取。
  • auth_basic:啟用基本身份驗證。
  • auth_basic_user_file:指定身份驗證檔案位置。
  • proxy_pass:將請求轉發到其他伺服器。
  • perl:使用 Perl 模組進行處理。

這些指令通常與 limit_except 或其他許可權控制指令結合使用,以達到更精細化的存取控制。

NGINX HTTP 核心模組指令探索

在建立穩固的網站基礎時,檔案存取和快取是至關重要的考量。NGINX 提供了多種指令來精確調整這些功能,以提升伺服器的效能和安全性。以下是一些關鍵的指令及其應用場景。

檔案處理與快取

disable_symlinks 指令允許控制 NGINX 如何處理符號連結。預設情況下,NGINX 會允許並跟隨符號連結。然而,為了提升安全性,可以根據不同條件來限制符號連結的使用。這裡有一些選項:

  • on:如果請求的 URI 中包含任何符號連結,則會拒絕存取並傳回 403 錯誤頁面。
  • if_not_owner:只有當符號連結與目標檔案擁有不同擁有者時,才會拒絕存取。
  • from=:可選引數,用於指定不檢查符號連結的 URL 部分。例如,disable_symlinks on from=$document_root 表示 NGINX 會正常跟隨符號連結直到 $document_root 目錄,如果在此之後發現符號連結,則會拒絕存取請求的檔案。

directio

directio 指令啟用 Direct I/O 機制來讀取大於指定大小的檔案。這樣可以避免中間快取過程,直接將資料從儲存裝置讀取到記憶體中。

  • 語法:大小值或 off
  • 預設值off

directio_alignment

directio_alignment 指令設定在使用 Direct I/O 時的位元組對齊。如果你使用的是 Linux 系統上的 XFS 檔案系統,建議將此值設定為 4K。

  • 語法:大小值
  • 預設值:512

open_file_cache

open_file_cache 指令啟用快取來儲存已開啟檔案的資訊,而非實際檔案內容。這些資訊包括檔案描述符、修改時間、檔案是否存在、以及錯誤狀況等。

  • 語法open_file_cache max=X [inactive=Y] | off
  • 預設值off
  • 範例open_file_cache max=5000 inactive=180; 則表示快取最多 5000 個專案,且不活躍時間超過 180 秒後才會刪除。

open_file_cache_errors

open_file_cache_errors 指令啟用或停用 open_file_cache 的錯誤快取功能。

  • 語法onoff
  • 預設值off

open_file_cache_min_uses

open_file_cache_min_uses 指令定義了快取專案需要被存取的次數才能成為永久活躍狀態。

  • 語法:數值
  • 預設值:1
  • 範例open_file_cache_min_uses 3; 表示一個快取專案被存取三次後才會成為永久活躍狀態。

open_file_cache_valid

此指令指定 NGINX 在重新驗證快取專案之前等待的秒數。這樣可以確保快取資訊不會過期。

  • 語法:時間值(秒)
  • 預設值:60

読取前置

read_ahead

在 Linux 基礎作業系統上,啟用 read_ahead 指令可以預先讀取檔案的一部分內容,但實際指定的值對於預讀並無影響。

  • 語法:大小值
  • 預設值:0(停用預讀)

其他指令

NGINX 提供了多種其他指令來處理網頁伺服器日誌、URI 建構、DNS 和其他功能。

log_not_found

啟用或停用對 404 錯誤日誌的記錄。如果你的日誌中充滿了因缺少 favicon.ico 或 robots.txt 檔案導致的 404 錯誤,可以考慮關閉此功能。

  • 語法onoff
  • 預設值on

log_subrequest

啟用或停用對內部重定向或伺服器端包含(SSI)請求觸發的子請求進行日誌記錄。

  • 語法onoff
  • 預設值off

merge_slashes

啟用此指令會將 URI 中的多個連續斜線合併為一個斜線。例如,啟用後 http://website.com//documents/http://website.com/documents/ 將被視為相同路徑。

  • 語法onoff
  • 預設值off

msie_padding

針對 Microsoft Internet Explorer(MSIE)和 Google Chrome 瀏覽器家族設計的指令。當錯誤頁面(錯誤碼為 400 或更高)回應體小於 512 個位元組時,這些瀏覽器可能會顯示自己的錯誤頁面而非伺服器提供的詳細錯誤頁面。啟用此選項後,錯誤碼為 400 或更高的回應體將被填充到 512 個位元組。

  • 語法onoff
  • 預設值off

透過上述指令,玄貓可以精確調整 NGINX 的行為,提升網站效能和安全性。每個指令都有其特定應用場景和組態方式,根據實際需求進行調整將有助於建立更穩固且高效的網站基礎。