Nginx 在專案中的角色與設定實例

Nginx 是現代 Web 架構中不可或缺的高效能反向代理伺服器。它能處理靜態檔案、反向代理、負載平衡、快取與安全性強化等多種任務。以下以 Django 專案為例,說明 Nginx 的功能與設定檔設計。


Nginx 的主要功能

  1. 反向代理
    將外部請求轉發給後端應用(如 Gunicorn + Django),隱藏內部架構,提升安全性與彈性。

  2. 靜態檔案服務
    直接由 Nginx 回應 CSS、JS、圖片等靜態檔案,減輕後端負擔,加速回應速度。

  3. 快取與壓縮
    可設定快取策略(如 Cache-Control、expires),提升效能並減少頻寬消耗。

  4. 負載平衡
    將請求分配到多個後端服務,提升可用性與擴展性。

  5. 安全性強化
    可設定防火牆、限制來源、阻擋惡意請求、加強 HTTP 標頭等。


Nginx 生產環境設定(prod.conf)範例

server {
    listen 80;
    server_name shr.today www.shr.today;

    location /static/ {
        alias /staticfiles/;
        expires 7d;
        add_header Cache-Control "public";
    }

    location / {
        proxy_pass http://backend: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 $http_x_forwarded_proto;
    }
}

設定重點說明

  • listen 80;
    監聽 80 port,處理 HTTP 請求。

  • server_name shr.today www.shr.today;
    指定服務的網域名稱。

  • location /static/ { ... }

    • alias /staticfiles/;:將 /static/ 路徑對應到伺服器上的 /staticfiles/ 目錄(通常由 Django collectstatic 輸出)。
    • expires 7d;:設定瀏覽器快取靜態檔案 7 天。
    • add_header Cache-Control "public";:允許快取。
  • location / { ... }

    • proxy_pass http://backend:8000;:反向代理所有非靜態請求到後端 Django 服務(如 Gunicorn)。
    • 其他 proxy_set_header:傳遞原始請求資訊給後端,方便日誌與安全性判斷。

Nginx 開發環境設定(dev.conf)範例

server {
    listen 80;
    server_name localhost 127.0.0.1;

    location / {
        proxy_pass http://backend: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;
    }
}

說明

  • listen 80;
    監聽本機 80 port,處理 HTTP 請求。

  • server_name localhost 127.0.0.1;
    僅允許本機或 127.0.0.1 的請求,適合開發測試。

  • location / { ... }

    • proxy_pass http://backend:8000;
      將所有請求轉發到本機的 Django 服務(通常由 Gunicorn 或 runserver 啟動)。
    • 其他 proxy_set_header
      傳遞原始請求資訊給後端,方便日誌與除錯。
  • 未設定靜態檔案服務
    開發時通常由 Django 直接服務 static 檔案,Nginx 不需額外處理。


Nginx 負載平衡設定範例

當網站流量增加時,可用 Nginx 的負載平衡功能,將請求分散到多個 Django 應用實例:

upstream django_app {
    server backend1:8000;
    server backend2:8000;
    server backend3:8000;
}

server {
    listen 80;
    server_name shr.today www.shr.today;

    location /static/ {
        alias /staticfiles/;
        expires 7d;
        add_header Cache-Control "public";
    }

    location / {
        proxy_pass http://django_app;
        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 $http_x_forwarded_proto;
    }
}
  • upstream django_app { ... }:定義多個後端服務,Nginx 會自動分配請求。
  • proxy_pass http://django_app;:將請求分流到多個後端。

實務建議

  • 生產環境:靜態檔案務必交給 Nginx 處理,並設定合理快取。高流量時建議啟用負載平衡。
  • 開發環境:可簡化設定,讓 Django 直接服務 static,方便開發測試。
  • 安全性:可進一步加上 HTTPS、限制來源、加強 header 等。

結論

Nginx 能大幅提升專案的效能、可用性與安全性。
理解設定檔的每一段功能,包含靜態檔案服務、反向代理與負載平衡,有助於打造穩定、可維護且可擴展的生產環境。