引言
Nginx 作為高性能的 Web 服務器和反向代理,其配置靈活性和強大功能備受開發者青睞。本文基于一份生產環境的 Nginx 配置文件,詳細拆解其核心配置邏輯,涵蓋性能優化、HTTPS 安全配置、反向代理及靜態資源處理等關鍵環節,幫助讀者理解如何構建高效可靠的 Nginx 服務。
一、全局配置:進程管理與日志系統
1. 進程管理
user nginx;
worker_processes auto;
pid /var/run/nginx.pid;
-
user nginx
:指定 Nginx 工作進程運行的用戶,通常使用非 root 用戶以增強安全性。 -
worker_processes auto
:自動根據服務器 CPU 核心數設置工作進程數,充分利用多核性能。生產環境建議設為 CPU 核心數或其 2 倍。
2. 日志系統
error_log /var/log/nginx/error.log notice;
access_log /var/log/nginx/access.log buffer=16k flush=1m main;
error_log /var/log/nginx/error.log error;
-
錯誤日志:
-
error_log /var/log/nginx/error.log notice;
:全局錯誤日志級別為?notice
,記錄普通警告信息。 -
error_log /var/log/nginx/error.log error;
:在?http
?塊中覆蓋為?error
?級別,僅記錄嚴重錯誤,減少日志冗余。
-
-
訪問日志:
-
buffer=16k flush=1m
:啟用 16KB 緩沖區,每 1 分鐘強制寫入磁盤,減少 I/O 操作,提升高并發下的性能。 -
log_format main
:自定義日志格式,包含客戶端 IP、請求時間、狀態碼、用戶代理等關鍵信息,便于后續分析。
-
二、Events 模塊:連接處理優化
events {worker_connections 1024;
}
-
worker_connections 1024
:每個工作進程的最大連接數。計算公式:worker_processes * worker_connections
?為 Nginx 最大并發連接數。生產環境可根據內存調整(如 4096),但需注意系統文件句柄限制(可通過?ulimit -n
?查看)。
三、HTTP 核心配置:性能與壓縮
1. 基礎性能優化
http {sendfile on;tcp_nopush on;keepalive_timeout 65;
}
-
sendfile on
:啟用零拷貝傳輸,減少 CPU 消耗,提升靜態文件傳輸效率。 -
tcp_nopush on
:配合?sendfile
,將多個小數據包合并為一個大數據包發送,減少網絡延遲。 -
keepalive_timeout 65
:長連接超時時間,避免無效連接占用資源。
2. Gzip 壓縮配置
gzip on;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types text/plain text/css application/javascript application/json;
gzip_disable "msie6|trident";
-
gzip on
:啟用壓縮,通常可將文本類資源壓縮至原大小的 1/4。 -
comp_level 6
:壓縮級別(1-9),6 為平衡壓縮率與 CPU 消耗的推薦值。 -
min_length 256
:僅壓縮大于 256 字節的資源,避免小文件壓縮后體積反而增大。 -
gzip_types
:指定壓縮的 MIME 類型,優先壓縮 HTML、CSS、JS、JSON 等文本內容。 -
gzip_disable
:禁用對舊瀏覽器(如 IE6)的壓縮,避免兼容性問題。
四、HTTPS 配置:安全通信與性能平衡
1. 強制 HTTPS 重定向
server {listen 80;server_name 域名或IP地址;return 301 https://$host$request_uri;
}
-
通過 80 端口的?
server
?塊,將所有 HTTP 請求永久重定向(301)至 HTTPS,確保通信安全。
2. HTTPS 核心配置
server {listen 443 ssl http2;server_name 域名或IP地址;ssl_certificate ssl證書配置的pem;ssl_certificate_key ssl證書配置的key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:...;ssl_prefer_server_ciphers on;
}
-
協議與加密算法:
-
ssl_protocols
:僅啟用 TLSv1.2 和 TLSv1.3,禁用不安全的舊協議(如 SSLv3、TLSv1.0)。 -
ssl_ciphers
:使用現代加密算法,優先選擇 ECDHE 算法,提供前向保密(FS)。 -
ssl_prefer_server_ciphers on
:服務端優先選擇加密算法,增強安全性。
-
-
性能優化:
-
ssl_session_cache shared:SSL:10m
:共享 SSL 會話緩存,減少重復握手開銷。 -
ssl_session_timeout 10m
:會話緩存超時時間,合理設置可提升連接復用率。
-
3. 安全響應頭
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";
-
X-Content-Type-Options nosniff
:防止瀏覽器誤判資源 MIME 類型,避免 XSS 攻擊。 -
X-Frame-Options DENY
:禁止頁面被嵌入到 iframe 中,防范點擊劫持。 -
Strict-Transport-Security
:強制瀏覽器使用 HTTPS 連接,有效期 1 年(max-age=31536000
),包含子域名。
五、反向代理與動態服務
1. 反向代理至 FastAPI 服務
location / {proxy_pass http://fastapi: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_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
}
-
請求頭透傳:
-
X-Real-IP
?和?X-Forwarded-For
:傳遞客戶端真實 IP,便于后端服務記錄和驗證。 -
Upgrade
?和?Connection
:支持 WebSocket 協議升級,確保動態服務兼容性。
-
-
超時設置:
-
proxy_connect_timeout 30s
:連接上游服務器的超時時間。 -
proxy_read_timeout 86400s
:讀取上游響應的超時時間(長連接場景可設為大值)。
-
六、靜態資源處理
location /static/ {expires 3h;add_header Cache-Control "max-age=10800, public";alias /path/to/static/files/; # 需替換為實際路徑try_files $uri =404;
}
-
緩存控制:
-
expires 3h
?和?Cache-Control: max-age=10800
:強制瀏覽器緩存靜態資源 3 小時,減少重復請求。
-
-
路徑映射:
-
alias
:將?/static/
?前綴替換為實際文件路徑(如?/var/www/static/
),避免?root
?導致的路徑重復問題。
-
-
錯誤處理:
try_files $uri =404
?確保不存在的文件直接返回 404,提升響應速度。
七、配置驗證與最佳實踐
1. 語法檢查
nginx -t # 驗證配置文件語法正確性
2. 性能調優建議
-
連接數優化:根據服務器內存調整?
worker_connections
(公式:worker_processes * worker_connections <= 系統最大文件句柄數
)。 -
SSL 證書管理:使用 Let’s Encrypt 自動續簽證書,避免證書過期導致服務中斷。
-
日志分析:結合 ELK Stack 或 Prometheus 分析訪問日志,監控異常請求和慢響應。
八、示例nginx.conf文件
user nginx;
worker_processes auto;error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {include /etc/nginx/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 buffer=16k flush=1m main;error_log /var/log/nginx/error.log error;sendfile on;tcp_nopush on;keepalive_timeout 65;# 壓縮文件配置gzip on;gzip_comp_level 6;gzip_min_length 256;gzip_buffers 16 8k;gzip_http_version 1.1;gzip_vary on;# 壓縮文件類型gzip_typestext/plaintext/csstext/javascriptapplication/javascriptapplication/jsonapplication/xmlapplication/xml+rssapplication/xhtml+xml;# 禁用對舊瀏覽器的壓縮gzip_disable "msie6|trident";include /etc/nginx/conf.d/*.conf;# 關鍵配置server {listen 80;server_name 域名或IP地址;return 301 https://$host$request_uri;}server {listen 443 ssl http2;server_name 域名或IP地址;# SSL 證書配置ssl_certificate ssl證書配置的pem;ssl_certificate_key ssl證書配置的key;# SSL 安全配置(優化后)ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_session_tickets off;error_page 497 https://$host$request_uri;# 安全頭add_header X-Content-Type-Options nosniff;add_header X-Frame-Options DENY;add_header X-XSS-Protection "1; mode=block";add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";# 反向代理location / {# 使用服務名或網絡別名代替本地地址,不支持httpsproxy_pass http://fastapi: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;# WebSocket 支持proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 超時設置 (根據實際需求調整)proxy_connect_timeout 30s;proxy_read_timeout 86400s;proxy_send_timeout 30s;# 可選: 緩沖區設置proxy_buffering on;proxy_buffer_size 4k;proxy_buffers 4 32k;}# 靜態資源location /static/ {expires 3hadd_header Cache-Control "max-age=10800, public";alias 文件路徑try_files $uri =404;}}
}
九、總結
本文拆解的 Nginx 配置涵蓋了性能優化、HTTPS 安全、反向代理及靜態資源管理的核心邏輯。關鍵亮點包括:
-
通過?
sendfile
、Gzip 壓縮和長連接配置提升性能; -
嚴格的 HTTPS 配置與安全響應頭增強數據傳輸安全;
-
靈活的反向代理與 WebSocket 支持適配現代應用架構。
實際部署時,需根據業務場景調整參數(如超時時間、緩存策略),并定期進行安全審計和性能壓測,確保 Nginx 服務穩定高效運行。