Nginx 在專案中的角色與設定實例
Nginx 是現代 Web 架構中不可或缺的高效能反向代理伺服器。它能處理靜態檔案、反向代理、負載平衡、快取與安全性強化等多種任務。以下以 Django 專案為例,說明 Nginx 的功能與設定檔設計。
Nginx 的主要功能
-
反向代理
將外部請求轉發給後端應用(如 Gunicorn + Django),隱藏內部架構,提升安全性與彈性。 -
靜態檔案服務
直接由 Nginx 回應 CSS、JS、圖片等靜態檔案,減輕後端負擔,加速回應速度。 -
快取與壓縮
可設定快取策略(如 Cache-Control、expires),提升效能並減少頻寬消耗。 -
負載平衡
將請求分配到多個後端服務,提升可用性與擴展性。 -
安全性強化
可設定防火牆、限制來源、阻擋惡意請求、加強 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 能大幅提升專案的效能、可用性與安全性。
理解設定檔的每一段功能,包含靜態檔案服務、反向代理與負載平衡,有助於打造穩定、可維護且可擴展的生產環境。