從零手寫實現 nginx-21-modules 模組

老马啸西风發表於2024-06-13

前言

大家好,我是老馬。很高興遇到你。

我們為 java 開發者實現了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何處理的,可以參考我的另一個專案:

手寫從零實現簡易版 tomcat minicat

手寫 nginx 系列

如果你對 nginx 原理感興趣,可以閱讀:

從零手寫實現 nginx-01-為什麼不能有 java 版本的 nginx?

從零手寫實現 nginx-02-nginx 的核心能力

從零手寫實現 nginx-03-nginx 基於 Netty 實現

從零手寫實現 nginx-04-基於 netty http 出入參最佳化處理

從零手寫實現 nginx-05-MIME型別(Multipurpose Internet Mail Extensions,多用途網際網路郵件擴充套件型別)

從零手寫實現 nginx-06-資料夾自動索引

從零手寫實現 nginx-07-大檔案下載

從零手寫實現 nginx-08-範圍查詢

從零手寫實現 nginx-09-檔案壓縮

從零手寫實現 nginx-10-sendfile 零複製

從零手寫實現 nginx-11-file+range 合併

從零手寫實現 nginx-12-keep-alive 連線複用

從零手寫實現 nginx-13-nginx.conf 配置檔案介紹

從零手寫實現 nginx-14-nginx.conf 和 hocon 格式有關係嗎?

從零手寫實現 nginx-15-nginx.conf 如何透過 java 解析處理?

從零手寫實現 nginx-16-nginx 支援配置多個 server

從零手寫實現 nginx-17-nginx 預設配置最佳化

從零手寫實現 nginx-18-nginx 請求頭+響應頭操作

從零手寫實現 nginx-19-nginx cors

從零手寫實現 nginx-20-nginx 佔位符 placeholder

從零手寫實現 nginx-21-nginx modules 模組資訊概覽

從零手寫實現 nginx-22-nginx modules 分模組載入最佳化

從零手寫實現 nginx-23-nginx cookie 的操作處理

從零手寫實現 nginx-24-nginx IF 指令

前言

大家好,我是老馬。

這一節我們來系統的看一下 nginx 有哪些模組,為我們後續的設計實現打下基礎。

模組概覽

Nginx 的配置檔案通常由幾個不同的模組組成,這些模組定義了伺服器的不同方面。以下是一些主要的配置模組:

  1. main(主配置) - 這是配置檔案的核心部分,包括了全域性設定和預設行為。

  2. events(事件) - 這個模組定義了Nginx如何處理連線和事件。例如,它設定了工作程序的數量和連線的超時時間。

  3. http(HTTP模組) - 這個模組定義了HTTP伺服器的配置,包括日誌格式、MIME型別、副檔名和檔案型別對映等。

  4. mail(郵件模組) - 如果Nginx配置為郵件代理,這個模組定義了郵件處理的配置。

  5. stream(流模組) - 這個模組定義了TCP和UDP伺服器的配置,用於處理非HTTP協議的流量。

  6. server(伺服器) - 這個模組定義了虛擬伺服器的配置,包括監聽的埠、伺服器名稱、處理請求的規則等。

  7. location(位置) - 這個模組定義了請求的匹配規則和相應的處理指令,可以巢狀在server模組中。

  8. upstream(上游) - 這個模組定義了後端伺服器的列表,用於負載均衡和反向代理。

  9. include(包含) - 這個指令用於包含其他配置檔案,使得配置更加模組化和易於管理。

  10. log_format(日誌格式) - 定義自定義的日誌格式。

  11. ssl(SSL模組) - 如果配置了SSL,這個模組定義了SSL相關的設定,如證書和金鑰檔案。

  12. if(條件判斷) - 這個指令允許在配置檔案中進行條件判斷,根據條件來啟用或禁用某些配置。

這些模組透過不同的指令和引數組合,允許管理員精細地控制Nginx伺服器的行為。

配置檔案通常以nginx.conf為檔名,並且可以在不同的目錄級別上進行分割,以便於管理和維護。

模組

1. Main (全域性) 模組

全域性模組配置 Nginx 的全域性設定,例如工作程序數量、日誌路徑等。

通常,這些配置位於 Nginx 配置檔案的頂部。

worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

指令

Nginx Main(全域性)模組配置指令及其示例:

指令名稱 說明 示例
worker_processes 指定工作程序數量。 worker_processes auto;
error_log 配置錯誤日誌路徑和日誌級別。 error_log /var/log/nginx/error.log warn;
pid 指定儲存 Nginx 主程序 PID 的檔案路徑。 pid /run/nginx.pid;
worker_rlimit_nofile 設定工作程序可開啟的最大檔案描述符數量。 worker_rlimit_nofile 8192;
worker_priority 設定工作程序的優先順序。 worker_priority -10;
daemon 是否以守護程序方式執行 Nginx。 daemon on;
master_process 是否啟用主程序模式。 master_process on;
user 設定 Nginx 程序的使用者和組。 user www-data;
worker_cpu_affinity 繫結工作程序到特定 CPU 核心。 worker_cpu_affinity auto;
worker_shutdown_timeout 設定工作程序關閉時的超時時間。 worker_shutdown_timeout 10s;
timer_resolution 設定事件定時器的解析度。 timer_resolution 100ms;
include 包含其他配置檔案。 include /etc/nginx/conf.d/*.conf;
load_module 動態載入 Nginx 模組。 load_module modules/ngx_http_geoip_module.so;
env 設定環境變數。 env PATH;
env MY_VARIABLE=value;

配置示例

以下是一個包含多個 Main 模組指令的 Nginx 配置示例:

worker_processes auto;                             # 自動配置工作程序數量
error_log /var/log/nginx/error.log warn;           # 錯誤日誌路徑和級別
pid /run/nginx.pid;                                # PID 檔案路徑
worker_rlimit_nofile 8192;                         # 最大檔案描述符數量
worker_priority -10;                               # 工作程序優先順序
daemon on;                                         # 以守護程序方式執行
master_process on;                                 # 啟用主程序模式
user www-data;                                     # 程序使用者和組
worker_cpu_affinity auto;                          # 自動繫結工作程序到 CPU 核心
worker_shutdown_timeout 10s;                       # 工作程序關閉超時時間
timer_resolution 100ms;                            # 事件定時器解析度
include /etc/nginx/conf.d/*.conf;                  # 包含其他配置檔案
load_module modules/ngx_http_geoip_module.so;      # 動態載入模組
env PATH;                                          # 設定環境變數
env MY_VARIABLE=value;                             # 設定自定義環境變數

透過合理配置這些全域性指令,可以最佳化 Nginx 的效能和穩定性,並確保其在各種作業系統和硬體環境下的高效執行。

2. Events 模組

Events 模組配置與連線處理相關的引數,例如每個工作程序允許的最大連線數。

events {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

Nginx 的 Events 模組用於配置處理事件的相關引數,例如每個工作程序允許的最大連線數、使用的事件模型等。以下是 Nginx Events 模組的常見配置指令及其示例:

指令名稱 說明 示例
worker_connections 每個工作程序允許的最大連線數。 worker_connections 1024;
multi_accept 設定工作程序是否同時接受多個新連線。 multi_accept on;
use 指定使用的事件驅動模型。 use epoll;

配置示例

以下是一個包含多個 Events 模組指令的 Nginx 配置示例:

events {
    worker_connections 1024;  # 每個工作程序允許的最大連線數
    multi_accept on;          # 同時接受多個新連線
    use epoll;                # 使用 epoll 事件驅動模型(適用於 Linux)
}

指令詳細說明

  1. worker_connections

    • 說明:設定每個工作程序允許的最大連線數。這是一個關鍵引數,決定了 Nginx 的併發處理能力。
    • 示例:worker_connections 1024;
  2. multi_accept

    • 說明:當設定為 on 時,每個工作程序將嘗試同時接受所有的新連線。當負載較重時,這可以提高連線的接受速度。
    • 示例:multi_accept on;
  3. use

    • 說明:指定 Nginx 使用的事件驅動模型。常見的選項包括 selectpollkqueueepoll/dev/polleventport 等。選擇適合作業系統和負載的事件模型可以顯著提高效能。
    • 示例:use epoll;(epoll 是 Linux 上效能優異的事件驅動模型)

透過合理配置 Events 模組指令,可以最佳化 Nginx 的事件處理效能,提升伺服器在高併發環境下的響應能力。

events 模組可以配置多個嗎?

在 Nginx 中,Events 模組本身只能配置一個。

這是因為 Events 模組主要用於配置與事件處理相關的引數,例如工作程序允許的最大連線數、事件驅動模型等。

這些配置對於整個 Nginx 例項是全域性性質的,因此只需要一個 Events 模組來定義這些引數即可。

在 Nginx 的配置檔案中,Events 模組通常位於 nginx.conf 檔案的頂層,如下所示:

events {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

上述配置示例中,events 塊內的指令只能配置一次,且其中的指令影響所有工作程序和連線處理。

如果需要更多的事件處理配置,通常情況下並不會在同一個配置檔案中重複定義 events 塊,而是依賴於全域性配置的一致性。

因此,答案是:在 Nginx 中,Events 模組本身只能配置一個,用於定義全域性的事件處理引數。

3. HTTP 模組

HTTP 模組是最常用的模組,包含 HTTP 伺服器和反向代理相關的配置。

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    keepalive_timeout 65;

    # Include server blocks
    include /etc/nginx/conf.d/*.conf;
}

nginx http 模組可以配置多個嗎?

在 Nginx 配置檔案中,每個檔案只能包含一個 http 塊,用於定義 HTTP 伺服器的全域性配置。

這個 http 塊包含了所有的 server 塊,每個 server 塊代表一個虛擬主機或者一個 HTTP 服務配置單元。

Nginx HTTP 模組配置指令及其示例:

以下是一些常見的 Nginx HTTP 模組配置指令及其說明:

指令名稱 說明
include 包含其他配置檔案。
default_type 設定預設的 MIME 型別。
log_format 定義日誌格式。
access_log 配置訪問日誌路徑和格式。
error_log 配置錯誤日誌路徑和級別。
gzip 啟用或禁用 Gzip 壓縮。
gzip_types 配置哪些 MIME 型別的響應需要進行 Gzip 壓縮。
client_max_body_size 設定請求體的最大大小。
keepalive_timeout 配置 Keep-Alive 連線超時時間。
proxy_cache_path 配置反向代理的快取路徑和引數。
proxy_set_header 設定傳送給後端伺服器的 HTTP 頭欄位。
proxy_pass 設定反向代理到後端伺服器。
root 設定請求的根目錄。
index 設定預設的索引檔案。
try_files 配置嘗試查詢檔案的規則。
error_page 配置錯誤頁面。
expires 設定響應的過期時間。
add_header 新增 HTTP 響應頭欄位。
ssl_certificate 配置 SSL 證書檔案路徑。
ssl_certificate_key 配置 SSL 證書私鑰檔案路徑。
ssl_protocols 配置支援的 SSL 協議版本。
ssl_ciphers 配置支援的 SSL 加密演算法。
server_name 配置虛擬主機的域名。
listen 配置監聽的埠和 IP 地址。
resolver 配置域名解析器地址。
include 包含其他配置檔案。

以下是一個示例 Nginx 配置檔案,包含了上述提到的一些常見的 HTTP 模組配置指令:

# 定義全域性的 MIME 型別和預設型別
http {
    include       mime.types;
    default_type  application/octet-stream;

    # 定義日誌格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 配置訪問日誌
    access_log /var/log/nginx/access.log main;

    # 配置錯誤日誌
    error_log /var/log/nginx/error.log warn;

    # 第一個虛擬主機配置
    server {
        listen       80;
        server_name  example.com www.example.com;

        root /var/www/example.com;
        index index.html index.htm;

        # 配置請求處理規則
        location / {
            try_files $uri $uri/ =404;
        }

        # 配置反向代理
        location /api/ {
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # 啟用 Gzip 壓縮
        gzip on;
        gzip_types text/plain application/xml;
    }

    # 第二個虛擬主機配置
    server {
        listen       80;
        server_name  anotherdomain.com;

        root /var/www/anotherdomain.com;
        index index.html index.htm;

        # 配置請求處理規則
        location / {
            try_files $uri $uri/ =404;
        }

        # 配置 SSL
        ssl_certificate /etc/nginx/ssl/anotherdomain.com.crt;
        ssl_certificate_key /etc/nginx/ssl/anotherdomain.com.key;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        # 新增自定義 HTTP 頭欄位
        add_header X-Frame-Options "SAMEORIGIN";
    }

    # 全域性配置
    client_max_body_size 10M;
    keepalive_timeout 65;

    # 配置 HTTP 快取
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
}

在這個示例配置檔案中:

  • http 塊包含了全域性的配置,如包含其他配置檔案、預設 MIME 型別、日誌格式和路徑等。
  • 兩個 server 塊分別定義了兩個虛擬主機的配置,包括監聽的埠、域名、根目錄、索引檔案、請求處理規則(使用 location 塊)、反向代理配置、Gzip 壓縮、SSL 配置等。
  • 全域性配置部分包括了一些通用的配置指令,如客戶端請求體大小限制 (client_max_body_size)、Keep-Alive 連線超時時間 (keepalive_timeout),以及 HTTP 快取配置 (proxy_cache_path)。

這個示例展示瞭如何透過組合使用不同的 Nginx HTTP 模組配置指令,來實現一個具有多個虛擬主機、反向代理、SSL 加密、HTTP 頭欄位新增、Gzip 壓縮和快取控制的完整的 HTTP 伺服器配置。

4. Server 模組

Server 模組配置單個虛擬主機的引數。

它通常包含在 HTTP 模組內。

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    location = /404.html {
        internal;
    }
}

nginx server 模組常見的指令表格

以下是一些常見的 Nginx server 模組配置指令及其說明:

指令名稱 說明
listen 配置監聽的埠和 IP 地址。
server_name 配置虛擬主機的域名。
root 設定請求的根目錄。
index 設定預設的索引檔案。
location 定義請求處理的位置塊。
try_files 配置嘗試查詢檔案的規則。
error_page 配置錯誤頁面。
access_log 配置訪問日誌路徑和格式。
error_log 配置錯誤日誌路徑和級別。
ssl_certificate 配置 SSL 證書檔案路徑。
ssl_certificate_key 配置 SSL 證書私鑰檔案路徑。
ssl_protocols 配置支援的 SSL 協議版本。
ssl_ciphers 配置支援的 SSL 加密演算法。
add_header 新增 HTTP 響應頭欄位。
proxy_pass 設定反向代理到後端伺服器。
proxy_set_header 設定傳送給後端伺服器的 HTTP 頭欄位。
proxy_read_timeout 配置從後端伺服器讀取響應的超時時間。
proxy_connect_timeout 配置與後端伺服器建立連線的超時時間。
proxy_send_timeout 配置向後端伺服器傳送請求的超時時間。
proxy_buffering 啟用或禁用反向代理緩衝。
proxy_cache 啟用反向代理快取。
proxy_cache_valid 配置反向代理快取的有效期。
proxy_cache_key 配置反向代理快取鍵。
proxy_cache_path 配置反向代理快取路徑和引數。
limit_req_zone 配置請求速率限制區域。
limit_conn_zone 配置連線速率限制區域。
gzip 啟用或禁用 Gzip 壓縮。
gzip_types 配置哪些 MIME 型別的響應需要進行 Gzip 壓縮。
gzip_comp_level 配置 Gzip 壓縮級別。
gzip_min_length 配置啟用 Gzip 壓縮的最小響應長度。
gzip_buffers 配置 Gzip 壓縮使用的緩衝區大小。
gzip_disable 配置禁用 Gzip 壓縮的條件。
expires 設定響應的過期時間。
add_header 新增 HTTP 響應頭欄位。
error_page 配置錯誤頁面。

這些指令允許管理員在每個 server 塊中配置特定虛擬主機的行為,從基本的請求處理到高階的代理、安全和效能調優配置。

透過合理配置這些指令,可以實現豐富的功能和靈活的伺服器行為定製。

nginx server 模組常見的配置例子

以下是一個簡單的 Nginx server 模組的配置例子,展示瞭如何配置一個基本的靜態檔案伺服器:

server {
    listen 80;  # 監聽埠

    server_name example.com www.example.com;  # 設定虛擬主機的域名

    root /var/www/example.com;  # 設定根目錄

    index index.html index.htm;  # 設定預設的索引檔案

    access_log /var/log/nginx/example.access.log;  # 配置訪問日誌
    error_log /var/log/nginx/example.error.log;    # 配置錯誤日誌

    location / {
        try_files $uri $uri/ =404;  # 配置請求處理規則
    }

    location /images/ {
        # 反向代理到另一個伺服器的示例
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 啟用 Gzip 壓縮
    gzip on;
    gzip_types text/plain application/xml;

    # 新增自定義 HTTP 響應頭
    add_header X-Frame-Options "SAMEORIGIN";

    # 設定 SSL 配置示例
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
}

在這個例子中:

  • listen 指令指定了 Nginx 監聽的埠。
  • server_name 指令設定了虛擬主機的域名。
  • root 指令定義了伺服器的根目錄,客戶端請求將在這個根目錄下查詢檔案。
  • index 指令設定了預設的索引檔案,如果請求的路徑是一個目錄,則嘗試顯示指定的索引檔案。
  • access_logerror_log 指令配置了訪問日誌和錯誤日誌的路徑。
  • location / 塊定義了基本的請求處理規則,使用 try_files 指令嘗試查詢請求的檔案。
  • location /images/ 塊演示瞭如何配置反向代理,將以 /images/ 開頭的請求轉發到 http://backend_server
  • gzip 指令啟用了 Gzip 壓縮,並配置了需要壓縮的 MIME 型別。
  • add_header 指令新增了自定義的 HTTP 響應頭欄位。
  • ssl_certificatessl_certificate_key 指令配置了 SSL 證書和私鑰的路徑,啟用了 HTTPS 訪問。
  • ssl_protocolsssl_ciphers 指令配置了 SSL 支援的協議版本和加密演算法。

這個配置示例展示了一個基本的 Nginx HTTP 伺服器配置,包括靜態檔案服務、反向代理、Gzip 壓縮、自定義響應頭、SSL 配置等功能。

根據實際需求,可以進一步調整和擴充套件這些配置來滿足特定的應用場景和安全要求。

5. Location 模組

Location 模組用於定義請求路徑和處理方法。

location /images/ {
    root /data;
}

location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

nginx location 常見的指令表格

在 Nginx 的 location 塊中,常見的配置指令用於定義請求的處理規則和行為。以下是一些常見的 Nginx location 塊配置指令及其說明:

指令名稱 說明
alias 定義請求的路徑別名。
root 設定請求的根目錄。
try_files 配置嘗試查詢檔案的規則。
index 設定預設的索引檔案。
rewrite 定義重寫規則。
return 定義返回響應碼和重定向。
error_page 配置錯誤頁面。
expires 設定響應的過期時間。
limit_req 配置請求速率限制。
limit_conn 配置連線速率限制。
proxy_pass 設定反向代理到後端伺服器。
proxy_set_header 設定傳送給後端伺服器的 HTTP 頭欄位。
proxy_read_timeout 配置從後端伺服器讀取響應的超時時間。
proxy_connect_timeout 配置與後端伺服器建立連線的超時時間。
proxy_send_timeout 配置向後端伺服器傳送請求的超時時間。
proxy_buffering 啟用或禁用反向代理緩衝。
proxy_cache 啟用反向代理快取。
proxy_cache_valid 配置反向代理快取的有效期。
proxy_cache_key 配置反向代理快取鍵。
proxy_cache_path 配置反向代理快取路徑和引數。
fastcgi_pass 設定 FastCGI 後端伺服器。
fastcgi_param 設定傳遞給 FastCGI 伺服器的引數。
uwsgi_pass 設定 uWSGI 後端伺服器。
scgi_pass 設定 SCGI 後端伺服器。
grpc_pass 設定 gRPC 後端伺服器。
include 包含其他配置檔案。

這些指令允許管理員在 location 塊中配置特定請求路徑的處理規則,包括路徑重寫、快取控制、反向代理、FastCGI、uWSGI、SCGI 等 CGI 協議支援,以及各種請求速率和連線速率的限制。配置檔案中可以根據具體需求組合和使用這些指令,以實現複雜的請求路由和後端服務整合。

nginx location 常見的配置例子

以下是一些常見的 Nginx location 塊配置示例,展示了不同情況下如何配置具體的請求處理規則:

靜態檔案服務

server {
    listen 80;
    server_name example.com;

    root /var/www/example.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location /images/ {
        alias /var/www/images/;
    }
}
  • 說明
    • / 路徑下的請求使用 try_files 指令嘗試查詢檔案,如果找不到則返回 404。
    • /images/ 路徑下的請求使用 alias 指令將請求路徑對映到伺服器檔案系統中的另一個位置。

反向代理

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
  • 說明
    • 所有 / 路徑下的請求將被反向代理到名為 backend_server 的後端伺服器。
    • 使用 proxy_set_header 指令設定傳送給後端伺服器的 HTTP 頭欄位。

FastCGI 服務

server {
    listen 80;
    server_name php.example.com;

    root /var/www/php.example.com;
    index index.php;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
  • 說明
    • 所有以 .php 結尾的請求將使用 fastcgi_pass 指令轉發到 PHP FastCGI 程序。
    • fastcgi_param 指令設定傳遞給 FastCGI 伺服器的引數,例如 SCRIPT_FILENAME

快取控制

server {
    listen 80;
    server_name static.example.com;

    root /var/www/static.example.com;
    index index.html;

    location / {
        expires 1d;
    }
}
  • 說明
    • 所有請求在 / 路徑下,響應的過期時間設定為 1 天,使用 expires 指令。

HTTPS 配置

server {
    listen 443 ssl;
    server_name secure.example.com;

    ssl_certificate /etc/nginx/ssl/secure.example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/secure.example.com.key;

    location / {
        # HTTPS 配置的具體內容
    }
}
  • 說明
    • 使用 ssl_certificatessl_certificate_key 指令配置 SSL 證書和私鑰路徑。
    • 此處 location / 塊內可以配置與 HTTPS 相關的其他指令,如 SSL 協議版本、加密演算法等。

這些示例展示了在不同場景下如何配置 Nginx 的 location 塊,以實現靜態檔案服務、反向代理、FastCGI、快取控制和 HTTPS 安全設定等功能。

根據具體需求,可以進一步調整和擴充套件這些配置來滿足特定的應用場景和安全要求。

6. Upstream 模組

Upstream 模組配置負載均衡和反向代理的後端伺服器組。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}

nginx Upstream 模組指令表格

在 Nginx 中,Upstream 模組用於定義一組後端伺服器,常用於負載均衡和反向代理配置。

以下是一些常見的 Nginx Upstream 模組配置指令及其說明:

指令名稱 說明
upstream 定義一個上游伺服器組。
server 定義單個上游伺服器。
weight 設定伺服器的權重,用於負載均衡。
max_fails 設定在伺服器被標記為不可用前允許的最大失敗次數。
fail_timeout 設定在伺服器被標記為不可用多長時間後嘗試重新啟用的時間。
backup 指定伺服器為備份伺服器,只有在所有非備份伺服器失敗時才會使用。
down 標記伺服器為永久不可用,不會嘗試與其建立連線。
keepalive 設定與上游伺服器的 keepalive 連線引數。
zone 設定共享記憶體區域以跟蹤上游伺服器的狀態。
hash 根據指定的鍵值對請求進行雜湊分配。
ip_hash 根據客戶端 IP 地址進行雜湊分配。
least_conn 選擇活躍連線數最少的伺服器進行請求分發。

這些指令允許管理員配置上游伺服器組的各種引數,包括負載均衡策略、健康檢查、備份伺服器、連線保持等。

透過合理配置 Upstream 模組,可以實現高可用性、負載均衡和效能最佳化的反向代理服務。

nginx Upstream 模組配置例子

以下是一個簡單的 Nginx Upstream 模組的配置例子,演示瞭如何定義一組後端伺服器並進行負載均衡配置:

http {
    upstream backend_servers {
        server backend1.example.com weight=3;
        server backend2.example.com:8080 max_fails=3 fail_timeout=30s;
        server 192.168.1.100:8080 backup;
        server unix:/var/run/backend3.sock;
        keepalive 32;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
  • 說明
    • upstream backend_servers { ... } 定義了一個名為 backend_servers 的上游伺服器組。
    • server 指令用於定義每個後端伺服器的配置:
      • backend1.example.com 權重為 3,表示比其他伺服器被選中的機率更高。
      • backend2.example.com:8080 設定了最大失敗次數為 3 次,每次失敗後等待 30 秒後再次嘗試。
      • 192.168.1.100:8080 設為備份伺服器,在所有非備份伺服器失敗時才會使用。
      • unix:/var/run/backend3.sock 使用 UNIX 域套接字連線。
    • keepalive 32; 設定與上游伺服器的 keepalive 連線數。

在上述配置中,Nginx 將透過 proxy_pass 指令將所有來自 example.com 的請求代理到 backend_servers 組中的後端伺服器。

透過合理配置權重、失敗處理和備份伺服器,可以實現高可用性和負載均衡,確保應用在各種條件下的穩定執行。

7. Stream 模組

Stream 模組用於配置 TCP/UDP 代理服務。

stream {
    upstream backend {
        server backend1.example.com:12345;
        server backend2.example.com:12345;
    }

    server {
        listen 12345;
        proxy_pass backend;
    }
}

nginx stream 模組的指令表格

Nginx 的 Stream 模組用於處理 TCP 和 UDP 流量,例如用於代理和負載均衡非 HTTP 流量。

以下是一些常見的 Nginx Stream 模組配置指令及其說明:

指令名稱 說明
stream 定義一個 TCP 或 UDP 代理伺服器。
server 定義一個 TCP 或 UDP 伺服器塊。
listen 配置監聽的 IP 地址和埠。
proxy_pass 設定反向代理到後端伺服器。
proxy_timeout 配置與後端伺服器的超時時間。
proxy_connect_timeout 配置與後端伺服器建立連線的超時時間。
proxy_send_timeout 配置向後端伺服器傳送資料的超時時間。
proxy_read_timeout 配置從後端伺服器讀取資料的超時時間。
proxy_protocol 啟用或禁用代理協議支援。
ssl_preread 啟用 SSL 預讀取用於 TCP 和 UDP 代理。
allow 定義允許連線的 IP 地址或地址範圍。
deny 定義拒絕連線的 IP 地址或地址範圍。
limit_conn 配置併發連線數限制。
limit_rate 配置限制連線速率。
zone 配置共享記憶體區域以跟蹤連線狀態。
resolver 配置域名解析器地址。

這些指令允許管理員配置 Nginx Stream 模組用於處理 TCP 或 UDP 流量的各種行為,包括代理、超時控制、SSL 預讀取、訪問控制、限速等。

透過合理配置這些指令,可以實現非 HTTP 流量的反向代理、負載均衡和安全控制。

nginx stream 模組的常見配置例子

以下是一個簡單的 Nginx Stream 模組的配置例子,演示瞭如何配置 TCP 和 UDP 代理伺服器:

TCP 代理

stream {
    upstream backend_servers {
        server backend1.example.com:12345;
        server backend2.example.com:12345;
    }

    server {
        listen 12345;
        proxy_pass backend_servers;
        proxy_timeout 3s;
    }
}
  • 說明
    • stream { ... } 定義了一個 TCP 代理伺服器。
    • upstream backend_servers { ... } 定義了一個名為 backend_servers 的上游伺服器組。
    • server { ... } 定義了一個 TCP 伺服器塊,監聽埠 12345
    • proxy_pass backend_servers; 使用 proxy_pass 指令將所有來自客戶端的 TCP 請求代理到 backend_servers 組中的後端伺服器。
    • proxy_timeout 3s; 配置與後端伺服器的超時時間為 3 秒。

UDP 代理

stream {
    server {
        listen 12345 udp;
        proxy_pass backend_server;
        proxy_timeout 3s;
        proxy_responses 1;
    }
}
  • 說明
    • stream { ... } 定義了一個 UDP 代理伺服器。
    • server { ... } 定義了一個 UDP 伺服器塊,監聽 UDP 埠 12345
    • proxy_pass backend_server; 使用 proxy_pass 指令將所有來自客戶端的 UDP 請求代理到 backend_server
    • proxy_timeout 3s; 配置與後端伺服器的超時時間為 3 秒。
    • proxy_responses 1; 配置 UDP 代理的最大響應次數為 1。

這些示例展示瞭如何配置 Nginx Stream 模組來處理 TCP 和 UDP 流量的代理功能。

透過合理配置 upstreamserver 塊,可以實現 TCP 和 UDP 請求的負載均衡、超時控制和安全性。

小結

看的出來,nginx 的模組非常強大。

我們實現的時候,還是要分清主次,依次處理。

我是老馬,期待與你的下次重逢。

開源地址

為了便於大家學習,已經將 nginx 開源

https://github.com/houbb/nginx4j

相關文章