返回文章列表

NGINX 模組組態:核心模組與進階應用

本文探討 NGINX 重要模組的組態與應用,包含 Referer 模組、Real IP 模組、SSL 模組,以及 Stub Status 和第三方模組的整合方式。文章涵蓋了設定細節、實務案例分析和未來趨勢預測,並提供 PHP、

Web 開發 系統管理

NGINX 模組化設計使其具備高度彈性與擴充性,能滿足多樣化的網站需求。Referer 模組可限制來源網域,Real IP 模組則能準確識別客戶端真實 IP,對於反向代理架構尤為重要。SSL 模組是保障網站安全性的根本,正確組態憑證與金鑰是建構 HTTPS 的關鍵。此外,Stub Status 模組提供伺服器狀態監控,讓管理者能快速掌握 NGINX 執行狀況。第三方模組的整合則能進一步擴充 NGINX 功能,例如 Access Key 模組提供類別似 Secure Link 的檔案保護機制,Fancy Indexes 模組則能美化自動目錄列表,而 Headers More 模組則賦予 HTTP 標頭設定更大的彈性。然而,整合第三方模組時需謹慎評估安全性,避免引入潛在漏洞。在與後端應用程式整合方面,NGINX 可透過 FastCGI 技術與 PHP-FPM 協同運作,也能透過反向代理機制與 Python 的 Django 框架整合,實作高效能的 Web 服務。

NGINX 模組組態探索

NGINX 作為一個強大的 Web 伺服器,提供了豐富的模組來滿足不同的需求。這些模組包括處理 HTTP 頁首、SSL 安全性及實際使用者 IP 地址等。以下是對這些模組的探討與技術解說。

參照者模組

參照者模組(Referer Module)允許你根據 HTTP 要求中的 Referer 頁首來限制存取。這在防止熱連結、檢查來源網站等方面非常有用。以下是一些常見的組態選項:

valid_referers none blocked *.website.com *.google.com;
if ($invalid_referer) {
    return 403;
}

內容解密:

這段程式碼定義了有效的參照者並傳回錯誤碼:

  • valid_referers 指令指定哪些參照者是有效的。none 表示沒有參照者,blocked 表示已阻止的參照者,而 *.website.com*.google.com 則是特定網域名稱下的任何子網域名稱。
  • if ($invalid_referer) 條件檢查是否有無效的參照者。
  • return 403; 當檢測到無效的參照者時,傳回 HTTP 403 錯誤碼,表示禁止存取。

然而,需要注意的是,由於 Referer 頁首可以被輕易偽造,因此這種方法不應被視為安全措施。

此外,這個模組還提供了 referer_hash_bucket_sizereferer_hash_max_size 指令來定義有效參照者雜湊表的桶大小和最大大小。

Real IP 模組

Real IP 模組主要用於替換客戶端 IP 地址,特別是在使用反向代理或後端伺服器的情況下。這個模組允許你從 HTTP 頁首中提取真實的 IP 地址。

real_ip_header X-Forwarded-For;
set_real_ip_from 192.168.0.0/16;
set_real_ip_from 127.0.0.1;
set_real_ip_from unix:; # 信任所有 UNIX 域通訊端

內容解密:

  • real_ip_header 指令設定使用哪個 HTTP 頁首來替換 IP 地址。這裡使用的是 X-Forwarded-For 頁首。
  • set_real_ip_from 指令定義信任的 IP 地址或 CIDR 段。這裡設定信任了 192.168.0.0/16127.0.0.1 和所有 UNIX 域通訊端。

以下是一些 Real IP 模組中其他重要指令的說明:

| 指令 | 說明 | |








|



















| | set_real_ip_from | 設定信任的地址或 CIDR 段,這些地址允許使用實際 IP 頁首替換客戶端 IP 地址。 | | real_ip_header | 設定用於替換 IP 地址的 HTTP 頁首。 | | real_ip_recursive | 若設定為 on,則會將替換後的 IP 設定為最後一個非信任的 IP;若設定為 off,則會替換成最後一個 IP,無論是否信任。 |

SSL 模組

SSL 模組使 NGINX 能夠提供 HTTPS 支援,從而保護網站和存取者之間的資料傳輸。

ssl on;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

內容解密:

  • ssl on; 啟用 HTTPS 支援。
  • ssl_certificate 指令設定憑證檔案路徑。
  • ssl_certificate_key 指令設定私鑰檔案路徑。
  • ssl_protocols 指令指定使用哪些 SSL/TLS 傳輸協定。
  • ssl_ciphers 指令指定使用哪些加密套件。

以下是一些其他重要 SSL 組態指令:

| 指令 | 說明 | |








|



















| | ssl_client_certificate | 設定客戶端憑證檔案路徑。 | | ssl_crl | 載入憑證復原列表 (CRL) 檔案。 | | ssl_dhparam | 設定 Diffie-Hellman 引數檔案路徑。 | | ssl_verify_client | 啟用客戶端憑證驗證並將結果儲存在 $ssl_client_verify 中。 | | ssl_verify_depth | 指定客戶端憑證鏈的驗證深度。 | | ssl_session_cache | 組態 SSL 工作階段快取。 | | ssl_session_timeout | 當啟用 SSL 工作階段時,設定工作階段資料使用超時時間。 | | ssl_password_phrase_file | 指定包含秘密金鑰密碼片語的檔案路徑。 |

Plantuml 流程圖示

此圖示展示了 NGINX 的基本請求處理流程:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title NGINX 模組組態:核心模組與進階應用

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

內容解密:

  • A:客戶端發起請求。
  • B:請求到達 NGINX 伺服器。
  • C:檢查請求中的 Referer 頁首是否有效。
    • 若無效(No),傳回 HTTP 403 錯誤碼。
    • 若有效(Yes),進一步檢查 Real IP。
  • E:檢查是否需要設定實際 IP 地址。
    • 若不需要(No),直接處理請求。
    • 若需要(Yes),設定實際 IP 地址後再處理請求。

透過這些組態選項和指令,NGINX 能夠靈活地滿足不同場景下對於安全性和功能性的需求。希望這些內容能夠幫助你更好地理解和應用 NGINX 的各種模組組態技術!

NGINX SSL 模組與高階功能組態

NGINX 作為一個強大的反向代理伺服器與負載平衡器,其 SSL 模組提供了豐富的組態選項,能夠滿足各種安全需求。本文將探討 NGINX SSL 模組的組態細節,並介紹一些高階功能模組的使用方法。

NGINX SSL 模組的基本組態

在開始組態之前,確保你已經擁有以下檔案:

  • 一個 .key 檔案,使用 openssl genrsa -out secure.website.com.key 2048 生成。
  • 一個 .csr 檔案,使用 openssl req -new -key secure.website.com.key -out secure.website.com.csr 生成。
  • 由認證機構(CA)發出的網站證書檔案,例如 secure.website.com.crt
  • 由 CA 提供的 CA 證書檔案,例如 gd_bundle.crt(如果從 GoDaddy 購買)。

首先,將你的網站證書和 CA 證書合併:

cat secure.website.com.crt gd_bundle.crt > combined.crt

接著,組態 NGINX 以使用這些證書:

server {
    listen 443;
    server_name secure.website.com;
    ssl on;
    ssl_certificate /path/to/combined.crt;
    ssl_certificate_key /path/to/secure.website.com.key;
    # 其他組態...
}

詳細探討 SSL 模組指令

以下是一些常用的 SSL 模組指令:

ssl_session_tickets

這個指令啟用 TLS 會話票證,允許客戶端快速重新連線而不需要重新協商。

ssl_session_tickets on;
  • 語法onoff
  • 預設值on

ssl_session_ticket_key

這個指令設定用於加密和解密 TLS 會話票證的金鑰檔案路徑。預設情況下會生成一個隨機值。

ssl_session_ticket_key /path/to/ticket.key;
  • 語法Filename
  • 預設值:無

ssl_trusted_certificate

這個指令設定受信任證書檔案的路徑(PEM 格式),用於驗證客戶端證書並進行 OCSP 回應的釘接。

ssl_trusted_certificate /path/to/trusted.crt;
  • 語法Filename
  • 預設值:無

SSL 銷售技術(OCSP Stapling)

SSL 銷售技術(OCSP Stapling)是一種技術,允許客戶端快速連線並還原到 SSL/TLS 伺服器會話,而不需要聯絡 CA。這樣可以減少 SSL 機密協商時間。NGINX 支援 OCSP Stapling,以下是如何啟用它:

  1. 啟用 OCSP Stapling
    ssl_stapling on;
    
  2. 啟用 OCSP 回應驗證
    ssl_stapling_verify on;
    
  3. 設定受信任證書檔案路徑
    ssl_trusted_certificate /path/to/fullchain.pem;
    

高階功能模組

除了 SSL 模組外,NGINX 還提供一些高階功能模組來增強其能力。

Stub Status 模組

Stub Status 模組提供伺服器當前狀態的資訊,如活動連線數和處理過的請求數等。要啟用它,請在 location 塊中新增 stub_status 指令:

location = /nginx_status {
    stub_status on;
    allow 127.0.0.1; # 建議保護這些資訊
    deny all;
}

實務案例分析

在實際應用中,這些組態可以顯著提升網站的安全性和效能。例如,使用 ssl_session_tickets 和 OCSP Stapling 可以大幅減少 SSL 機密協商時間,提升使用者經驗。同時,Stub Status 模組可以幫助管理員實時監控伺服器狀態,及時發現並解決問題。

未來趨勢預測

隨著網路安全需求的不斷提升,NGINX 的 SSL 模組和高階功能模組將會變得越來越重要。未來可能會看到更多針對 TLS 和 HTTP/3 的最佳化措施,以及更強大的監控和診斷工具。

總結來說,NGINX 提供了豐富的組態選項和高階功能模組,能夠滿足各種安全需求和效能最佳化需求。透過合理組態這些模組,可以顯著提升網站的安全性和效能。

使用 NGINX 模組來增強伺服器組態

在本文中,玄貓將探討如何使用 NGINX 模組來增強伺服器的組態,並展示一些實際案例。這些模組不僅能提升伺服器的效能,還能提供更多的功能和靈活性。讓我們從一些基本的模組開始,逐步探討其應用和優勢。

使用 Stub 狀態頁面來監控 NGINX

Stub 狀態頁面是一個簡單但有效的工具,可以幫助你監控 NGINX 的執行狀態。這個模組並不在 NGINX 的預設構建中,因此需要手動新增。以下是如何啟用並使用 Stub 狀態頁面的步驟。

組態 Stub 狀態頁面

首先,你需要在 NGINX 的組態檔案中新增相關設定。以下是一個簡單的範例:

server {
    listen 80;
    server_name example.com;

    location /stub_status {
        stub_status;
        allow 127.0.0.1; # 只允許本地存取
        deny all;        # 拒絕其他所有存取
    }
}

在這個範例中,我們設定了一個位於 /stub_status 的位置,只有來自本地的請求才能存取。這樣可以確保這個頁面不會被公開暴露。

檢視 Stub 狀態頁面

當你存取 /stub_status 時,你會看到類別似以下的結果:

Active connections: 1
server accepts handled requests
10 10 23
Reading: 0 Writing: 1 Waiting: 0

這些資料表示了當前活躍的連線、接受的請求數、處理的請求數、讀取中的連線數、寫入中的連線數以及等待中的連線數。

第三方監控解決方案

有一些第三方監控解決方案,如 Netdata,可以透過定期呼叫 Stub 狀態頁面來取得統計資料。這些工具可以幫助你更好地瞭解伺服器的執行狀況,並及時發現潛在問題。

HTTP 滲透模組

HTTP 滲透模組可以組態伺服器在記憶體不足時傳回錯誤頁面。這個模組透過定義一個記憶體閾值來觸發滲透檢查。

組態 HTTP 滲透模組

以下是如何組態 HTTP 滲透模組的範例:

http {
    degradation sbrk=500m; # 在 http 塊級插入記憶體閾值

    server {
        listen 80;
        server_name example.com;

        location / {
            degrade 204; # 在位置塊中指定錯誤碼(204 或 444)
        }
    }
}

在這個範例中,我們設定了一個記憶體閾值為 500M,當記憶體使用量達到這個閾值時,伺服器會傳回 204 錯誤碼。

整合第三方模組

NGINX 有許多由第三方開發者編寫的模組,這些模組可以從官方 Wiki 網站下載。然而,玄貓建議在整合這些第三方模組時要謹慎,因為它們可能會引入安全漏洞。

常見第三方模組

以下是一些常見的第三方模組及其功能:

  • Access Key 模組:類別似於 Secure Link,用於保護檔案。
  • Fancy Indexes 模組:改進自動目錄列表。
  • Headers More 模組:增強 HTTP 標頭的靈活性。

整合第三方模組步驟

整合第三方模組到你的 NGINX 構建中需要三個簡單步驟:

  1. 下載 .tar.gz 檔案。
  2. 提取檔案:
    tar xzf module.tar.gz
    
  3. 組態 NGINX 構建:
    ./configure --add-module=/module/source/path [...]
    

完成這些步驟後,模組就可以像普通 NGINX 模組一樣使用了。

PHP 和 Python 與 NGINX

FastCGI 技術簡介

FastCGI 是 Common Gateway Interface (CGI) 的改進版本。CGI 是一種早期的技術,用於讓網頁伺服器與應用程式進行通訊。FastCGI 提高了效能和效率。

CGI 原理

原始的 CGI 機制是這樣工作的:客戶端傳送請求給網頁伺服器,網頁伺服器將請求轉發給第三方應用程式(如 PHP 或 Python),應用程式處理後將結果傳回給網頁伺服器,網頁伺服器再將結果傳回給客戶端。

組態 NGINX 與 PHP-FPM

PHP-FPM 是 PHP FastCGI Process Manager 的縮寫。以下是如何組態 NGINX 與 PHP-FPM 的步驟。

安裝 PHP-FPM

首先,安裝 PHP-FPM:

sudo apt-get install php-fpm
組態 NGINX

然後,組態 NGINX 與 PHP-FPM:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.php index.html index.htm;

        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 調整版本號
        }
    }
}

組態 NGINX 與 Python 和 Django

Django 是一個流行的 Python Web 框架。以下是如何組態 NGINX 與 Django 的步驟。

安裝 Django 和 Gunicorn

首先,安裝 Django 和 Gunicorn:

pip install django gunicorn
組態 Gunicorn

然後,組態 Gunicorn:

gunicorn myproject.wsgi:application --bind 127.0.0.1:8000
組態 NGINX

最後,組態 NGINX:

server {
    listen 80;
    server_name example.com;

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