91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Nginx高性能配置詳細步驟

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2026-03-04 15:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Nginx高性能配置:反向代理、負載均衡與緩存優(yōu)化

一、概述

1.1 背景介紹

Nginx 1.26.x 是當(dāng)前 mainline 分支的最新穩(wěn)定線,在 HTTP/3 支持、動態(tài)模塊加載和內(nèi)存管理上相比 1.24.x 有明顯改進。1.24.x 已進入維護模式,新項目直接選 1.26.x,舊項目建議在下次維護窗口升級。

在現(xiàn)代微服務(wù)架構(gòu)中,Nginx 承擔(dān)的角色已遠超傳統(tǒng) Web 服務(wù)器。它是流量入口的第一道關(guān)卡:接收外部請求、終止 TLS、執(zhí)行負載均衡、緩存上游響應(yīng)、轉(zhuǎn)發(fā)到后端服務(wù)集群。一個配置不當(dāng)?shù)?Nginx 實例,即便后端服務(wù)性能再好,也會成為整個系統(tǒng)的瓶頸。

高性能配置的核心矛盾在于:默認配置面向通用場景,而生產(chǎn)環(huán)境需要針對具體硬件、流量模式和業(yè)務(wù)特征做定向調(diào)優(yōu)。worker 進程數(shù)、連接數(shù)上限、緩沖區(qū)大小、緩存策略——每一項參數(shù)背后都有對應(yīng)的系統(tǒng)資源約束,盲目調(diào)大不會帶來性能提升,反而可能引發(fā)內(nèi)存壓力或文件描述符耗盡。

1.2 技術(shù)特點

Nginx 采用事件驅(qū)動的異步非阻塞架構(gòu),與 Apache 的 prefork/worker 多進程模型有本質(zhì)區(qū)別:

事件驅(qū)動模型:基于 epoll(Linux)/ kqueue(BSD),單個 worker 進程可同時處理數(shù)萬并發(fā)連接,不依賴線程切換

異步非阻塞 I/O:磁盤讀寫、網(wǎng)絡(luò) I/O 均不阻塞 worker 進程,配合aio threads可將文件 I/O 卸載到線程池

低內(nèi)存占用:每個連接消耗約 10-20KB 內(nèi)存,10000 并發(fā)連接約占用 200MB,遠低于線程模型

零拷貝傳輸:sendfile系統(tǒng)調(diào)用直接在內(nèi)核態(tài)完成文件到網(wǎng)絡(luò)的數(shù)據(jù)傳輸,繞過用戶態(tài)緩沖區(qū)

模塊化架構(gòu):核心功能精簡,通過編譯時模塊或動態(tài)模塊擴展,避免加載不必要的功能

1.3 適用場景

反向代理:將外部 HTTP/HTTPS 請求轉(zhuǎn)發(fā)到內(nèi)網(wǎng)應(yīng)用服務(wù)器,隱藏后端拓撲,統(tǒng)一入口管理

負載均衡:在多個后端實例間分發(fā)流量,支持輪詢、加權(quán)、IP 哈希、最少連接等策略

靜態(tài)資源服務(wù):直接服務(wù) CSS/JS/圖片等靜態(tài)文件,性能遠超應(yīng)用服務(wù)器

API 網(wǎng)關(guān):結(jié)合 Lua(OpenResty)或 njs 模塊實現(xiàn)認證、限流、路由等網(wǎng)關(guān)功能

緩存加速:緩存上游響應(yīng),降低后端壓力,提升響應(yīng)速度

SSL 終止:集中處理 TLS 握手,后端服務(wù)使用明文 HTTP,簡化證書管理

1.4 環(huán)境要求

組件 版本要求 說明
操作系統(tǒng) Ubuntu 22.04+ / CentOS Stream 8+ CentOS 7 已 EOL,不建議新部署
Nginx 1.26.x mainline 1.24.x stable 可用,1.22.x 及以下避免
OpenSSL 3.0+ 支持 TLS 1.3,Ubuntu 22.04 默認滿足
CPU 4核+ worker 進程數(shù)建議與物理核心數(shù)一致
內(nèi)存 4GB+ 緩存配置需預(yù)留足夠內(nèi)存,建議 8GB+
磁盤 SSD,50GB+ proxy_cache 路徑建議獨立掛載點

二、詳細步驟

2.1 編譯安裝與基礎(chǔ)調(diào)優(yōu)

2.1.1 編譯參數(shù)選擇

包管理器安裝的 Nginx 通常缺少部分高性能模塊,生產(chǎn)環(huán)境建議從源碼編譯以獲得完整控制權(quán)。

# /opt/scripts/build-nginx.sh - Nginx 編譯安裝腳本
#!/bin/bash
set-euo pipefail

NGINX_VERSION="1.26.2"
BUILD_DIR="/tmp/nginx-build"
INSTALL_PREFIX="/etc/nginx"

# 安裝編譯依賴
apt-get install -y 
  build-essential 
  libpcre3-dev 
  libssl-dev 
  zlib1g-dev 
  libgd-dev 
  libgeoip-dev

mkdir -p"${BUILD_DIR}"
cd"${BUILD_DIR}"

wget"http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz"
tar -xzf"nginx-${NGINX_VERSION}.tar.gz"
cd"nginx-${NGINX_VERSION}"

./configure 
  --prefix=/etc/nginx 
  --sbin-path=/usr/sbin/nginx 
  --modules-path=/usr/lib64/nginx/modules 
  --conf-path=/etc/nginx/nginx.conf 
  --error-log-path=/var/log/nginx/error.log 
  --http-log-path=/var/log/nginx/access.log 
  --pid-path=/var/run/nginx.pid 
  --with-threads        # 啟用線程池,支持 aio threads
  --with-file-aio        # 異步文件 I/O,大文件傳輸性能提升明顯
  --with-http_v2_module     # HTTP/2 支持
  --with-http_v3_module     # HTTP/3 / QUIC 支持(1.25.0+ 正式支持)
  --with-http_ssl_module 
  --with-http_realip_module   # 獲取真實客戶端 IP(CDN/代理場景必須)
  --with-http_stub_status_module # 監(jiān)控狀態(tài)頁
  --with-http_gzip_static_module # 預(yù)壓縮靜態(tài)文件,避免每次請求重復(fù)壓縮
  --with-http_cache_purge_module # 緩存主動清理(需第三方模塊)
  --with-stream         # TCP/UDP 代理(數(shù)據(jù)庫代理、DNS 負載均衡)
  --with-stream_ssl_module 
  --with-pcre-jit        # PCRE JIT 加速正則匹配,location 規(guī)則多時效果顯著
  --with-ld-opt="-Wl,-rpath,/usr/local/lib"

make -j"$(nproc)"
make install

2.1.2 worker 進程與連接數(shù)配置

# /etc/nginx/nginx.conf - 主配置文件全局段
user nginx;

# auto 自動檢測 CPU 核心數(shù),等價于手動寫核心數(shù)
# 綁定 worker 到具體 CPU 核心可減少上下文切換,8核機器寫 auto
worker_processes auto;
worker_cpu_affinity auto;

# 單個 worker 可打開的最大文件描述符數(shù)
# 必須 >= worker_connections * 2(每個連接占用2個fd:客戶端+上游)
worker_rlimit_nofile 65536;

# 錯誤日志級別:生產(chǎn)用 warn,調(diào)試用 debug(debug 會產(chǎn)生大量日志,影響性能)
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

# 動態(tài)模塊加載(如需要)
load_module modules/ngx_http_geoip_module.so;

events {
  # 單 worker 最大并發(fā)連接數(shù)
  # 總并發(fā) = worker_processes * worker_connections
  # 4核機器設(shè) 16384,總并發(fā)約 65536
  worker_connections 16384;

  # 使用 epoll(Linux 最高效的 I/O 多路復(fù)用)
  use epoll;

  # 允許 worker 一次性接受所有新連接,而非逐個接受
  # 高并發(fā)場景下減少系統(tǒng)調(diào)用次數(shù),低流量場景意義不大
  multi_accept on;
}

2.1.3 內(nèi)核參數(shù)調(diào)優(yōu)

Nginx 性能上限受內(nèi)核參數(shù)約束,應(yīng)用層配置再好也無法突破內(nèi)核限制。

# /etc/sysctl.d/99-nginx-tuning.conf - 內(nèi)核參數(shù)調(diào)優(yōu)
# 修改后執(zhí)行 sysctl -p /etc/sysctl.d/99-nginx-tuning.conf 生效

# TCP 連接隊列長度,默認 128 遠不夠用,高并發(fā)場景必須調(diào)大
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 允許 TIME_WAIT 狀態(tài)的 socket 被新連接復(fù)用
# 反向代理場景下大量短連接會產(chǎn)生 TIME_WAIT,不開啟會導(dǎo)致端口耗盡
net.ipv4.tcp_tw_reuse = 1

# 系統(tǒng)最大文件描述符數(shù),必須大于 worker_rlimit_nofile * worker_processes
fs.file-max = 1000000

# 網(wǎng)卡接收隊列長度,10Gbps 網(wǎng)卡建議調(diào)大
net.core.netdev_max_backlog = 65535

# TCP 接收/發(fā)送緩沖區(qū),影響大文件傳輸和高延遲鏈路性能
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 本地端口范圍,反向代理向上游發(fā)起連接時使用
# 默認 32768-60999,約 28000 個端口,高并發(fā)場景可能不夠
net.ipv4.ip_local_port_range = 10000 65535
# 應(yīng)用內(nèi)核參數(shù)并驗證
sysctl -p /etc/sysctl.d/99-nginx-tuning.conf

# 驗證關(guān)鍵參數(shù)
sysctl net.core.somaxconn net.ipv4.tcp_tw_reuse fs.file-max

# 設(shè)置系統(tǒng)級文件描述符限制(/etc/security/limits.conf)
echo"nginx soft nofile 65536">> /etc/security/limits.conf
echo"nginx hard nofile 65536">> /etc/security/limits.conf

2.2 反向代理配置

2.2.1 upstream 配置與健康檢查

# /etc/nginx/conf.d/upstream.conf - upstream 定義文件

upstream backend_api {
  # keepalive 保持與上游的長連接池,避免每次請求重新建立 TCP 連接
  # 值為連接池中保持的空閑連接數(shù),不是最大連接數(shù)上限
  # 后端是 HTTP/1.1 應(yīng)用時,32-64 是合理起點
  keepalive 64;

  # keepalive_requests:單個長連接最多處理的請求數(shù),防止連接老化
  keepalive_requests 1000;

  # keepalive_timeout:空閑連接保持時間
  keepalive_timeout 60s;

  server 10.0.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
  server 10.0.1.12:8080 weight=3 max_fails=3 fail_timeout=30s;
  server 10.0.1.13:8080 weight=2 max_fails=3 fail_timeout=30s;

  # backup 服務(wù)器:僅在所有主服務(wù)器不可用時啟用
  server 10.0.1.14:8080 backup;
}

upstream backend_static {
  # 靜態(tài)資源服務(wù)器,使用最少連接策略
  least_conn;
  keepalive 32;

  server 10.0.1.21:80 weight=1;
  server 10.0.1.22:80 weight=1;
}

2.2.2 proxy_pass 細節(jié)

proxy_pass 的 trailing slash 是最常見的配置錯誤來源。proxy_pass http://backend/和proxy_pass http://backend行為完全不同:前者會截斷 location 前綴,后者保留完整 URI。

# /etc/nginx/conf.d/proxy-detail.conf

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

  location /api/ {
    # 末尾有斜杠:/api/users -> http://backend/users(截斷 /api 前綴)
    # 末尾無斜杠:/api/users -> http://backend/api/users(保留完整路徑)
    proxy_pass http://backend_api/;

    # 必須傳遞 Host,否則后端無法識別虛擬主機
    proxy_set_header Host $host;

    # 傳遞真實客戶端 IP,后端日志和業(yè)務(wù)邏輯依賴此值
    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;

    # 使用 HTTP/1.1 與上游通信,keepalive 必須配合此設(shè)置
    proxy_http_version 1.1;

    # 清除 Connection 頭,防止 keep-alive 信息傳遞到上游導(dǎo)致連接管理混亂
    proxy_set_header Connection "";

    # 連接超時:Nginx 與上游建立 TCP 連接的超時時間
    # 內(nèi)網(wǎng)服務(wù)設(shè) 5s 足夠,超過說明上游有問題
    proxy_connect_timeout 5s;

    # 讀取超時:等待上游響應(yīng)的超時時間(兩次讀操作之間的間隔)
    # 根據(jù)業(yè)務(wù)最慢接口設(shè)定,不是總響應(yīng)時間
    proxy_read_timeout 60s;

    # 發(fā)送超時:向上游發(fā)送請求的超時時間
    proxy_send_timeout 60s;

    # 緩沖區(qū)配置:響應(yīng)先緩沖到 Nginx,再發(fā)給客戶端
    # 關(guān)閉緩沖(proxy_buffering off)適合 SSE/流式響應(yīng)
    proxy_buffering on;
    proxy_buffer_size 16k;    # 響應(yīng)頭緩沖區(qū),通常 4k-16k 足夠
    proxy_buffers 8 32k;     # 響應(yīng)體緩沖區(qū)數(shù)量和大小
    proxy_busy_buffers_size 64k; # 同時向客戶端發(fā)送的最大緩沖量
  }
}

2.2.3 WebSocket 代理與長連接保持

# /etc/nginx/conf.d/websocket.conf

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''   close;
  # 當(dāng)客戶端不發(fā)送 Upgrade 頭時,Connection 設(shè)為 close
  # 避免普通 HTTP 請求被錯誤地保持為長連接
}

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

  location /ws/ {
    proxy_pass http://backend_ws;

    # WebSocket 升級握手必須的頭
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;

    # WebSocket 連接通常長時間保持,讀取超時需要設(shè)長
    # 或設(shè)為 0(永不超時),但要配合心跳機制
    proxy_read_timeout 3600s;

    # 關(guān)閉緩沖,WebSocket 消息需要實時傳遞
    proxy_buffering off;
  }
}

2.2.4 gRPC 反向代理配置

# /etc/nginx/conf.d/grpc.conf

upstream grpc_backend {
  server 10.0.1.11:50051;
  server 10.0.1.12:50051;
  keepalive 32;
}

server {
  listen 443 ssl http2; # gRPC 依賴 HTTP/2
  server_name grpc.example.com;

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

  location / {
    # grpc_pass 替代 proxy_pass,專用于 gRPC 協(xié)議
    grpc_pass grpc://grpc_backend;

    # gRPC 錯誤處理
    error_page 502 = /error502grpc;
  }

  location = /error502grpc {
    internal;
    default_type application/grpc;
    # gRPC 狀態(tài)碼:14 = UNAVAILABLE
    add_header grpc-status 14;
    add_header content-length 0;
    return 204;
  }
}

2.3 負載均衡策略

2.3.1 輪詢、加權(quán)輪詢與 ip_hash

# /etc/nginx/conf.d/lb-strategies.conf

# 默認輪詢:請求依次分發(fā)到每個 server,適合無狀態(tài)服務(wù)
upstream rr_backend {
  server 10.0.1.11:8080;
  server 10.0.1.12:8080;
  server 10.0.1.13:8080;
}

# 加權(quán)輪詢:按 weight 比例分發(fā),適合服務(wù)器配置不均的場景
# 下例中 .11 處理 50% 流量,.12 和 .13 各處理 25%
upstream weighted_backend {
  server 10.0.1.11:8080 weight=2;
  server 10.0.1.12:8080 weight=1;
  server 10.0.1.13:8080 weight=1;
}

# ip_hash:同一客戶端 IP 始終路由到同一后端
# 實現(xiàn)簡單的會話保持,但存在熱點問題(大量用戶來自同一 NAT IP)
# 不支持與 weight 同時使用(1.26.x 已支持,但行為需驗證)
upstream iphash_backend {
  ip_hash;
  server 10.0.1.11:8080;
  server 10.0.1.12:8080;
  server 10.0.1.13:8080;
}

2.3.2 least_conn 與一致性哈希

# /etc/nginx/conf.d/lb-advanced.conf

# least_conn:將請求發(fā)送到當(dāng)前活躍連接數(shù)最少的 server
# 適合請求處理時間差異大的場景(如混合快慢接口)
# 比輪詢更能避免慢請求堆積在某個 server 上
upstream leastconn_backend {
  least_conn;
  server 10.0.1.11:8080;
  server 10.0.1.12:8080;
  server 10.0.1.13:8080;
  keepalive 32;
}

# hash:基于自定義 key 的一致性哈希
# 適合緩存場景:相同 URL 始終路由到同一后端,提高后端緩存命中率
# consistent 參數(shù)啟用一致性哈希,server 增減時只有少量請求重新分配
upstream hash_backend {
  hash $request_uri consistent;
  server 10.0.1.11:8080;
  server 10.0.1.12:8080;
  server 10.0.1.13:8080;
}

# 基于請求頭的哈希(適合 API 網(wǎng)關(guān)按用戶 ID 路由)
upstream user_hash_backend {
  hash $http_x_user_id consistent;
  server 10.0.1.11:8080;
  server 10.0.1.12:8080;
}

2.3.3 被動健康檢查與主動健康檢查

開源版 Nginx 只支持被動健康檢查(請求失敗后標記 server 不可用),主動健康檢查是商業(yè)版 Nginx Plus 的功能。開源替代方案是nginx_upstream_check_module第三方模塊。

# /etc/nginx/conf.d/health-check.conf

upstream backend_with_check {
  server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
  server 10.0.1.12:8080 max_fails=3 fail_timeout=30s;
  server 10.0.1.13:8080 max_fails=3 fail_timeout=30s;

  # max_fails:在 fail_timeout 時間窗口內(nèi),失敗次數(shù)達到此值則標記為不可用
  # fail_timeout:不可用狀態(tài)持續(xù)時間,同時也是統(tǒng)計失敗次數(shù)的時間窗口
  # 上例:30秒內(nèi)失敗3次,則該 server 被下線30秒后重新嘗試

  keepalive 32;
}

# 如果編譯了 nginx_upstream_check_module,可配置主動健康檢查
# upstream backend_active_check {
#   server 10.0.1.11:8080;
#   server 10.0.1.12:8080;
#   check interval=3000 rise=2 fall=3 timeout=1000 type=http;
#   check_http_send "HEAD /health HTTP/1.0

";
#   check_http_expect_alive http_2xx http_3xx;
# }

2.3.4 會話保持方案對比

方案 實現(xiàn)方式 優(yōu)點 缺點 適用場景
ip_hash 客戶端 IP 哈希 配置簡單,無需后端改造 NAT 環(huán)境下負載不均,server 下線時會話丟失 小規(guī)模、無 CDN 場景
hash $cookie_session Cookie 哈希 比 ip_hash 更精準 需要客戶端支持 Cookie 有登錄態(tài)的 Web 應(yīng)用
sticky cookie(Plus) Nginx 注入 Cookie 精確綁定,支持 server 下線遷移 商業(yè)版功能 企業(yè)級有狀態(tài)應(yīng)用
應(yīng)用層共享 Session Redis/Memcached 徹底無狀態(tài),水平擴展 需要改造應(yīng)用代碼 推薦方案,新項目首選

2.4 緩存優(yōu)化

2.4.1 proxy_cache 配置

# /etc/nginx/nginx.conf - http 段緩存路徑定義

http {
  # 緩存路徑配置
  # levels=1:2:兩級目錄結(jié)構(gòu),避免單目錄文件過多影響文件系統(tǒng)性能
  # keys_zone=cache_main:100m:共享內(nèi)存區(qū)名稱和大小,100m 約存儲 80萬個 key
  # max_size=10g:緩存文件總大小上限,超出時 LRU 淘汰
  # inactive=60m:60分鐘內(nèi)未被訪問的緩存自動刪除
  # use_temp_path=off:直接寫入緩存目錄,避免跨文件系統(tǒng) rename 操作
  proxy_cache_path /data/nginx/cache
    levels=1:2
    keys_zone=cache_main:100m
    max_size=10g
    inactive=60m
    use_temp_path=off;

  # 第二個緩存區(qū),用于靜態(tài)資源(更大的 inactive 時間)
  proxy_cache_path /data/nginx/cache_static
    levels=1:2
    keys_zone=cache_static:50m
    max_size=20g
    inactive=7d
    use_temp_path=off;
}

2.4.2 緩存策略

# /etc/nginx/conf.d/cache-policy.conf

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

  # API 接口緩存
  location /api/ {
    proxy_pass http://backend_api/;
    proxy_cache cache_main;

    # 緩存 key 設(shè)計:包含 scheme、host、URI 和查詢參數(shù)
    # 如果接口有用戶態(tài),需要加入 Cookie 或 Authorization 頭
    proxy_cache_key "$scheme$host$request_uri";

    # 不同響應(yīng)碼的緩存時間
    proxy_cache_valid 200 302 10m; # 成功響應(yīng)緩存10分鐘
    proxy_cache_valid 404 1m;    # 404 緩存1分鐘,防止穿透攻擊
    proxy_cache_valid any 30s;   # 其他響應(yīng)碼緩存30秒

    # 繞過緩存的條件:有 Cookie 或特定請求頭時不使用緩存
    # $cookie_session 非空時,認為是登錄用戶,不走緩存
    proxy_cache_bypass $cookie_session $http_authorization;
    proxy_no_cache $cookie_session $http_authorization;

    # stale 配置:上游故障時,允許使用過期緩存響應(yīng)
    # 這是提升可用性的關(guān)鍵配置,避免上游抖動直接影響用戶
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

    # 防止緩存擊穿:同一 key 只允許一個請求回源,其他請求等待
    proxy_cache_lock on;
    proxy_cache_lock_timeout 5s;

    # 在響應(yīng)頭中暴露緩存狀態(tài),便于調(diào)試(生產(chǎn)可關(guān)閉)
    add_header X-Cache-Status $upstream_cache_status;

    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header Host $host;
  }
}

2.4.3 靜態(tài)文件緩存與 expires/Cache-Control

# /etc/nginx/conf.d/static-cache.conf

server {
  listen 80;
  server_name static.example.com;
  root /var/www/static;

  # 帶哈希指紋的靜態(tài)資源(如 app.a1b2c3d4.js)可永久緩存
  location ~* .(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
    # 瀏覽器緩存1年,CDN 緩存1年
    expires 1y;
    add_header Cache-Control "public, immutable";

    # 開啟 gzip 靜態(tài)壓縮(需要預(yù)先生成 .gz 文件)
    gzip_static on;

    # sendfile 零拷貝傳輸,靜態(tài)文件服務(wù)必開
    sendfile on;
    tcp_nopush on; # 配合 sendfile,批量發(fā)送響應(yīng)頭和文件內(nèi)容
  }

  # HTML 文件不緩存或短時緩存(內(nèi)容會更新)
  location ~* .html$ {
    expires -1;
    add_header Cache-Control "no-cache, no-store, must-revalidate";
  }

  # API 響應(yīng):私有緩存,不允許 CDN 緩存
  location /api/ {
    proxy_pass http://backend_api;
    add_header Cache-Control "private, no-cache";
  }
}

2.4.4 緩存預(yù)熱與清理

# /opt/scripts/cache-warm.sh - 緩存預(yù)熱腳本
#!/bin/bash
set-euo pipefail

NGINX_HOST="http://127.0.0.1"
URL_LIST="/opt/scripts/warm-urls.txt"
CONCURRENCY=10 # 并發(fā)預(yù)熱請求數(shù)

warm_cache() {
 localurl="$1"
 # 通過 curl 訪問觸發(fā)緩存,-s 靜默,-o /dev/null 丟棄響應(yīng)體
  curl -s -o /dev/null -w"%{http_code} %{url_effective}
"
    -H"Host: www.example.com"
   "${NGINX_HOST}${url}"
}

export-f warm_cache

# 使用 xargs 并發(fā)執(zhí)行預(yù)熱
cat"${URL_LIST}"| xargs -P"${CONCURRENCY}"-I{} bash -c'warm_cache "$@"'_ {}

echo"Cache warm-up completed"
# /etc/nginx/conf.d/cache-purge.conf
# 需要編譯 ngx_cache_purge 模塊

server {
  listen 80;
  server_name cache-admin.internal;

  # 限制只有內(nèi)網(wǎng)可以訪問清理接口
  allow 10.0.0.0/8;
  allow 192.168.0.0/16;
  deny all;

  location ~ /purge(/.*) {
    proxy_cache_purge cache_main "$scheme$host$1";
  }
}

2.5 SSL/TLS 優(yōu)化

2.5.1 TLS 1.3 配置與密碼套件選擇

# /etc/nginx/conf.d/ssl-base.conf - SSL 基礎(chǔ)配置(include 到各 server 塊)

# 只啟用 TLS 1.2 和 1.3,TLS 1.0/1.1 已被 RFC 8996 廢棄
ssl_protocols TLSv1.2 TLSv1.3;

# TLS 1.2 密碼套件:優(yōu)先 ECDHE(前向保密),禁用 RC4、3DES、MD5
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256ECDHE-ECDSA-AES256-GCM-SHA384ECDHE-ECDSA-CHACHA20-POLY1305DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

# 服務(wù)端優(yōu)先選擇密碼套件(TLS 1.3 中此設(shè)置被忽略)
ssl_prefer_server_ciphers off;

# DH 參數(shù)文件,防止 Logjam 攻擊
# 生成命令:openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
ssl_dhparam /etc/nginx/ssl/dhparam.pem;

# 橢圓曲線選擇:X25519 性能最好,P-256 兼容性最廣
ssl_ecdh_curve X25519secp384r1;

2.5.2 OCSP Stapling 與會話復(fù)用

# /etc/nginx/conf.d/ssl-performance.conf

# SSL 會話緩存:shared 在所有 worker 間共享,10m 約緩存 40000 個會話
ssl_session_cache shared10m;
ssl_session_timeout 1d; # 會話有效期1天,平衡安全性和性能

# TLS 1.3 會話票據(jù)(Session Tickets)
# 允許客戶端恢復(fù)會話,避免完整握手,減少延遲
# 注意:多臺 Nginx 需要共享相同的 ticket key,否則跨機器無法復(fù)用
ssl_session_tickets off; # 單機可開啟,集群環(huán)境需要同步 key 或關(guān)閉

# OCSP Stapling:Nginx 主動獲取證書吊銷狀態(tài)并緩存
# 客戶端無需單獨查詢 OCSP 服務(wù)器,減少握手延遲
ssl_stapling on;
ssl_stapling_verify on;

# 完整證書鏈(包含中間證書)
ssl_trusted_certificate /etc/nginx/ssl/chain.pem;

# DNS 解析器,用于 OCSP 查詢
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

2.5.3 HTTP/2 與 HTTP/3(QUIC) 啟用

# /etc/nginx/conf.d/http2-http3.conf

server {
  # HTTP/2:在 listen 指令中添加 http2 參數(shù)(Nginx 1.25.1+ 語法)
  listen 443 ssl;
  http2 on;

  # HTTP/3 / QUIC:基于 UDP,需要 1.25.0+ 且編譯了 --with-http_v3_module
  listen 443 quic reuseport;

  server_name www.example.com;

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

  include /etc/nginx/conf.d/ssl-base.conf;
  include /etc/nginx/conf.d/ssl-performance.conf;

  # 告知客戶端支持 HTTP/3,瀏覽器下次請求會嘗試 QUIC
  add_header Alt-Svc 'h3=":443"; ma=86400';

  # HSTS:強制瀏覽器使用 HTTPS,max-age 建議至少 6個月
  add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

  location / {
    proxy_pass http://backend_api;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header Host $host;
  }
}

# HTTP 重定向到 HTTPS
server {
  listen 80;
  server_name www.example.com;
  return 301 https://$host$request_uri;
}

三、示例代碼和配置

3.1 完整的生產(chǎn)級 nginx.conf

# /etc/nginx/nginx.conf - 生產(chǎn)級主配置文件

user nginx;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65536;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

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

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

  # 自定義日志格式,包含響應(yīng)時間和上游信息,便于性能分析
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
          '$status $body_bytes_sent "$http_referer" '
          '"$http_user_agent" "$http_x_forwarded_for" '
          'rt=$request_time uct=$upstream_connect_time '
          'uht=$upstream_header_time urt=$upstream_response_time';

  access_log /var/log/nginx/access.log main buffer=32k flush=5s;

  # 零拷貝文件傳輸,靜態(tài)文件服務(wù)必開
  sendfile on;

  # sendfile 開啟后才有效:將多個小包合并成一個 TCP 包發(fā)送,減少網(wǎng)絡(luò)開銷
  tcp_nopush on;

  # 禁用 Nagle 算法,減少小包延遲,對實時性要求高的場景有效
  tcp_nodelay on;

  # 客戶端連接保持時間,65s 是經(jīng)驗值,CDN 場景可適當(dāng)調(diào)長
  keepalive_timeout 65;
  keepalive_requests 1000;

  # 隱藏 Nginx 版本號,減少信息泄露
  server_tokens off;

  # 客戶端請求體大小限制,防止大文件上傳耗盡內(nèi)存
  client_max_body_size 100m;
  client_body_buffer_size 128k;

  # 請求頭緩沖區(qū),大 Cookie 或 JWT Token 場景需要調(diào)大
  client_header_buffer_size 4k;
  large_client_header_buffers 4 16k;

  # Gzip 壓縮配置
  gzip on;
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;    # 1-9,6 是壓縮率和 CPU 消耗的平衡點
  gzip_min_length 1024;  # 小于 1KB 的響應(yīng)不壓縮,壓縮收益低于開銷
  gzip_types text/plain text/css text/xml text/javascript
       application/json application/javascript application/xml
       application/rss+xml application/atom+xml image/svg+xml;

  # 線程池:將阻塞的文件 I/O 操作卸載到獨立線程,避免阻塞 worker
  thread_pool default threads=32 max_queue=65536;

  # 緩存區(qū)域定義(供各 server 塊引用)
  proxy_cache_path /data/nginx/cache
    levels=1:2
    keys_zone=cache_main:100m
    max_size=10g
    inactive=60m
    use_temp_path=off;

  include /etc/nginx/conf.d/*.conf;
}

3.2 多站點反向代理 + 負載均衡完整配置

# /etc/nginx/conf.d/production.conf - 生產(chǎn)多站點配置

# API 服務(wù)集群
upstream api_cluster {
  least_conn;
  keepalive 64;
  keepalive_requests 1000;
  keepalive_timeout 60s;

  server 10.0.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
  server 10.0.1.12:8080 weight=3 max_fails=3 fail_timeout=30s;
  server 10.0.1.13:8080 weight=2 max_fails=3 fail_timeout=30s;
  server 10.0.1.14:8080 backup;
}

# 靜態(tài)資源服務(wù)器
upstream static_cluster {
  server 10.0.1.21:80;
  server 10.0.1.22:80;
  keepalive 32;
}

# API 網(wǎng)關(guān)
server {
  listen 443 ssl;
  http2 on;
  listen 443 quic reuseport;
  server_name api.example.com;

  ssl_certificate /etc/nginx/ssl/api.example.com.crt;
  ssl_certificate_key /etc/nginx/ssl/api.example.com.key;
  include /etc/nginx/conf.d/ssl-base.conf;
  include /etc/nginx/conf.d/ssl-performance.conf;

  add_header Alt-Svc 'h3=":443"; ma=86400';
  add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
  add_header X-Content-Type-Options nosniff always;
  add_header X-Frame-Options DENY always;

  # 限流:每個 IP 每秒最多 100 個請求
  limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/s;
  limit_req zone=api_limit burst=200 nodelay;

  location /api/v1/ {
    proxy_pass http://api_cluster/;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    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;

    proxy_connect_timeout 5s;
    proxy_read_timeout 30s;
    proxy_send_timeout 30s;

    # 啟用緩存(GET 請求)
    proxy_cache cache_main;
    proxy_cache_key "$scheme$host$request_uri";
    proxy_cache_valid 200 5m;
    proxy_cache_valid 404 1m;
    proxy_cache_bypass $http_cache_control;
    proxy_no_cache $http_pragma $http_authorization;

    # 緩存命中狀態(tài)頭,便于調(diào)試
    add_header X-Cache-Status $upstream_cache_status;
  }

  # 健康檢查端點不緩存
  location /health {
    proxy_pass http://api_cluster;
    proxy_cache off;
    access_log off;
  }
}

# 靜態(tài)資源站點
server {
  listen 443 ssl;
  http2 on;
  server_name static.example.com;

  ssl_certificate /etc/nginx/ssl/static.example.com.crt;
  ssl_certificate_key /etc/nginx/ssl/static.example.com.key;
  include /etc/nginx/conf.d/ssl-base.conf;

  location ~* .(jpg|jpeg|png|gif|ico|css|js|woff2|svg)$ {
    proxy_pass http://static_cluster;
    proxy_cache cache_main;
    proxy_cache_valid 200 7d;

    # 瀏覽器緩存:靜態(tài)資源設(shè)置長期緩存,配合文件名哈希實現(xiàn)緩存破壞
    expires 30d;
    add_header Cache-Control "public, immutable";

    # 預(yù)壓縮文件優(yōu)先(需要 gzip_static 模塊)
    gzip_static on;
  }
}

3.3 緩存集群配置示例

# /etc/nginx/conf.d/cache-cluster.conf - 多級緩存配置

# 定義多個緩存區(qū)域,按內(nèi)容類型分離
proxy_cache_path /data/nginx/cache/api
  levels=1:2
  keys_zone=cache_api:50m
  max_size=5g
  inactive=30m
  use_temp_path=off;

proxy_cache_path /data/nginx/cache/static
  levels=1:2
  keys_zone=cache_static:100m
  max_size=20g
  inactive=7d
  use_temp_path=off;

# 緩存鎖:防止緩存擊穿(多個請求同時穿透到上游)
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
proxy_cache_lock_age 5s;

# 后臺更新:緩存過期時先返回舊內(nèi)容,后臺異步更新
# 避免緩存過期瞬間大量請求打到上游
proxy_cache_background_update on;

# 上游不可用時使用過期緩存(降級策略)
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

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

  location /api/ {
    proxy_pass http://api_cluster;
    proxy_cache cache_api;
    proxy_cache_key "$scheme$host$uri$is_args$args";
    proxy_cache_valid 200 302 5m;
    proxy_cache_valid 404 1m;

    # 忽略上游的 Set-Cookie,防止帶 Cookie 的響應(yīng)被緩存
    proxy_ignore_headers Set-Cookie;
    proxy_hide_header Set-Cookie;

    add_header X-Cache-Status $upstream_cache_status;
    add_header X-Cache-Date $upstream_http_date;
  }

  location /static/ {
    proxy_pass http://static_cluster;
    proxy_cache cache_static;
    proxy_cache_key "$uri"; # 靜態(tài)資源 key 不含 scheme/host,跨域共享緩存
    proxy_cache_valid 200 7d;
    proxy_cache_use_stale error timeout updating;

    expires 30d;
    add_header Cache-Control "public, max-age=2592000, immutable";
  }
}

四、最佳實踐和注意事項

4.1 最佳實踐

4.1.1 性能優(yōu)化

# /etc/nginx/conf.d/performance.conf - 性能優(yōu)化配置集合

http {
  # sendfile + tcp_nopush 組合:零拷貝傳輸 + 批量發(fā)送
  # sendfile 讓內(nèi)核直接將文件數(shù)據(jù)發(fā)送到網(wǎng)絡(luò),不經(jīng)過用戶態(tài)
  sendfile on;
  tcp_nopush on;

  # tcp_nodelay 禁用 Nagle 算法,減少小包延遲
  # 與 tcp_nopush 同時開啟時,Nginx 會先積累數(shù)據(jù)(tcp_nopush),
  # 連接進入 keepalive 狀態(tài)后再啟用 tcp_nodelay 刷新剩余數(shù)據(jù)
  tcp_nodelay on;

  # 線程池異步文件 I/O,避免磁盤讀寫阻塞 worker 進程
  # 適合大文件下載場景,小文件場景收益不明顯
  aio threads=default;
  aio_write on;

  # 直接 I/O:繞過操作系統(tǒng)頁緩存,適合大文件且不需要重復(fù)讀取的場景
  # 小文件或頻繁訪問的文件不要開啟,會降低性能
  # directio 512;

  # open_file_cache:緩存文件描述符、文件大小和修改時間
  # 避免每次請求都調(diào)用 stat() 系統(tǒng)調(diào)用
  open_file_cache max=10000 inactive=30s;
  open_file_cache_valid 60s;
  open_file_cache_min_uses 2;
  open_file_cache_errors on;

  # Gzip 壓縮:文本內(nèi)容壓縮率通常 60-80%,顯著減少傳輸量
  gzip on;
  gzip_comp_level 6;
  gzip_min_length 1024;
  gzip_vary on;
  gzip_proxied any;
  gzip_types
    text/plain text/css text/xml text/javascript
    application/json application/javascript application/xml
    application/rss+xml application/atom+xml image/svg+xml
    font/truetype font/opentype application/vnd.ms-fontobject;
}

4.1.2 安全加固

# /etc/nginx/conf.d/security.conf - 安全加固配置

server {
  # 隱藏 Nginx 版本號,攻擊者無法針對特定版本漏洞
  server_tokens off;

  # 限制請求方法,只允許 GET/POST/HEAD
  if ($request_method !~ ^(GET|POST|HEAD|PUT|DELETE|PATCH|OPTIONS)$) {
    return 405;
  }

  # 防止點擊劫持
  add_header X-Frame-Options SAMEORIGIN always;

  # 禁止 MIME 類型嗅探,防止 XSS 攻擊
  add_header X-Content-Type-Options nosniff always;

  # XSS 保護(現(xiàn)代瀏覽器已內(nèi)置,但舊版瀏覽器需要此頭)
  add_header X-XSS-Protection "1; mode=block" always;

  # 限制請求體大小,防止大文件上傳耗盡內(nèi)存
  client_max_body_size 10m;

  # 限制請求頭大小,防止 Header 注入攻擊
  large_client_header_buffers 4 8k;

  # 限流:防止暴力破解和 DDoS
  limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m;
  limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

  location /login {
    limit_req zone=login_limit burst=10 nodelay;
    limit_conn conn_limit 5;
    proxy_pass http://backend_api;
  }

  # 禁止訪問隱藏文件(.git、.env 等)
  location ~ /. {
    deny all;
    access_log off;
    log_not_found off;
  }

  # 禁止訪問備份文件
  location ~* .(bak|conf|dist|fla|inc|ini|log|psd|sh|sql|swp)$ {
    deny all;
  }
}

4.1.3 高可用配置(Keepalived + Nginx 雙主)

# /etc/keepalived/keepalived.conf - 主節(jié)點(192.168.1.11)配置

vrrp_script check_nginx {
  script"/opt/scripts/check-nginx.sh"
  interval 2  # 每2秒檢查一次
  weight -20  # 檢查失敗時優(yōu)先級降低20,觸發(fā) VIP 漂移
  fall 2    # 連續(xù)失敗2次才認為服務(wù)異常
  rise 2    # 連續(xù)成功2次才認為服務(wù)恢復(fù)
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 100       # 主節(jié)點優(yōu)先級高于備節(jié)點
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass nginx_ha_2024
  }
  virtual_ipaddress {
    192.168.1.100/24   # VIP,對外提供服務(wù)的 IP
  }
  track_script {
    check_nginx
  }
}
# /opt/scripts/check-nginx.sh - Nginx 健康檢查腳本
#!/bin/bash
set-euo pipefail

# 檢查 Nginx 進程是否存在
if! pgrep -x nginx > /dev/null;then
 # 嘗試重啟 Nginx
  systemctl start nginx
  sleep 2
 # 重啟后再次檢查,失敗則退出非零狀態(tài)觸發(fā) VIP 漂移
  pgrep -x nginx > /dev/null ||exit1
fi

# 檢查 Nginx 是否能正常響應(yīng)請求
http_code=$(curl -s -o /dev/null -w"%{http_code}"http://127.0.0.1/health)
if["${http_code}"!="200"];then
 exit1
fi

exit0

4.2 注意事項

4.2.1 配置注意事項

proxy_pass末尾斜杠是最常見的配置錯誤:proxy_pass http://backend/會截斷 location 前綴,proxy_pass http://backend則保留完整 URI。在 location 使用正則表達式時,proxy_pass不能帶 URI 部分(即不能有斜杠后的路徑),否則 Nginx 會拒絕啟動。

worker_connections設(shè)置的是單個 worker 的連接數(shù)上限,包含客戶端連接和上游連接。作為反向代理時,每個客戶端請求至少占用 2 個連接(客戶端 + 上游),實際并發(fā)客戶端數(shù)約為worker_connections / 2。

proxy_cache_path的keys_zone內(nèi)存區(qū)只存儲緩存 key 的索引,不存儲緩存內(nèi)容本身。100m 的 keys_zone 約能存儲 80 萬個 key,緩存內(nèi)容存儲在磁盤上。

4.2.2 常見錯誤

錯誤現(xiàn)象 原因分析 解決方案
502 Bad Gateway 上游服務(wù)不可用或連接超時 檢查上游服務(wù)狀態(tài),調(diào)整 proxy_connect_timeout
504 Gateway Timeout 上游響應(yīng)超時 增大 proxy_read_timeout,或優(yōu)化上游接口性能
413 Request Entity Too Large 請求體超過 client_max_body_size 調(diào)大 client_max_body_size 或在上游處理
499 Client Closed Request 客戶端在響應(yīng)前斷開連接 通常是客戶端超時,檢查客戶端超時設(shè)置
upstream timed out (110) 上游連接超時 檢查上游服務(wù)負載,調(diào)整超時參數(shù)
no live upstreams while connecting 所有上游節(jié)點不可用 檢查上游服務(wù),調(diào)整 max_fails/fail_timeout
worker_connections are not enough 連接數(shù)耗盡 增大 worker_connections 和 worker_rlimit_nofile
open() failed (24: Too many open files) 文件描述符耗盡 增大 worker_rlimit_nofile 和系統(tǒng) ulimit

4.2.3 兼容性問題

HTTP/3 (QUIC) 需要防火墻放行 UDP 443 端口,許多企業(yè)網(wǎng)絡(luò)默認封鎖 UDP,導(dǎo)致 HTTP/3 降級到 HTTP/2。Alt-Svc響應(yīng)頭告知瀏覽器支持 HTTP/3,瀏覽器會在后續(xù)請求中嘗試 QUIC,失敗后自動回退,不影響功能。

http2 on指令是 1.25.1 引入的新語法,舊版本使用listen 443 ssl http2。兩種語法不能混用,升級 Nginx 版本后需要統(tǒng)一遷移。

五、故障排查和監(jiān)控

5.1 故障排查

5.1.1 日志分析

# /etc/nginx/nginx.conf - 自定義日志格式

http {
  # 詳細日志格式,包含所有關(guān)鍵性能指標
  log_format detailed '$remote_addr - $remote_user [$time_local] '
            '"$request" $status $body_bytes_sent '
            '"$http_referer" "$http_user_agent" '
            'rt=$request_time '      # 總請求處理時間
            'uct=$upstream_connect_time ' # 與上游建立連接時間
            'uht=$upstream_header_time ' # 收到上游響應(yīng)頭時間
            'urt=$upstream_response_time ' # 上游響應(yīng)總時間
            'cs=$upstream_cache_status ' # 緩存命中狀態(tài)
            'ua=$upstream_addr';     # 實際處理請求的上游地址

  # 生產(chǎn)環(huán)境使用緩沖寫入,減少磁盤 I/O
  access_log /var/log/nginx/access.log detailed buffer=64k flush=10s;

  # 錯誤日志:warn 級別記錄重要錯誤,不記錄 notice/info 級別的噪音
  error_log /var/log/nginx/error.log warn;
}
# 常用日志分析命令

# 統(tǒng)計響應(yīng)狀態(tài)碼分布
awk'{print $9}'/var/log/nginx/access.log | sort | uniq -c | sort -rn

# 找出響應(yīng)時間最慢的10個請求
awk'{print $NF, $7}'/var/log/nginx/access.log | sort -rn | head -10

# 統(tǒng)計每分鐘請求量(流量趨勢)
awk'{print $4}'/var/log/nginx/access.log | cut -d: -f1-3 | uniq -c

# 找出請求量最大的 IP(排查 DDoS)
awk'{print $1}'/var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# 實時監(jiān)控錯誤日志
tail -f /var/log/nginx/error.log | grep -E"error|crit|alert|emerg"

5.1.2 常見問題排查

502 Bad Gateway 排查流程:

# 1. 確認上游服務(wù)是否存活
curl -v http://10.0.1.11:8080/health

# 2. 檢查 Nginx 錯誤日志中的具體錯誤信息
tail -100 /var/log/nginx/error.log | grep"upstream"

# 3. 檢查上游連接數(shù)是否耗盡
ss -s # 查看 TCP 連接統(tǒng)計
ss -tn state established | grep :8080 | wc -l

# 4. 檢查上游服務(wù)的文件描述符限制
cat /proc/$(pgrep -f"java")/limits | grep"open files"

連接數(shù)耗盡排查:

# 查看當(dāng)前連接數(shù)
ss -s

# 查看 TIME_WAIT 連接數(shù)(過多說明短連接頻繁)
ss -tn state time-wait | wc -l

# 查看 Nginx worker 打開的文件描述符數(shù)
ls /proc/$(pgrep nginx | head -1)/fd | wc -l

# 檢查系統(tǒng)文件描述符使用情況
cat /proc/sys/fs/file-nr

5.1.3 調(diào)試模式

# /etc/nginx/conf.d/debug.conf - 臨時調(diào)試配置(生產(chǎn)環(huán)境用完立即刪除)

# 針對特定 IP 開啟 debug 日志,避免全量 debug 影響性能
error_log /var/log/nginx/debug.log debug;

events {
  debug_connection 192.168.1.100; # 只對此 IP 的連接輸出 debug 日志
}
# 測試配置文件語法
nginx -t

# 查看編譯參數(shù)和模塊列表
nginx -V 2>&1 | tr' ''
'

# 重載配置(不中斷現(xiàn)有連接)
nginx -s reload

# 查看 Nginx 進程樹
ps aux | grep nginx

# 實時查看連接狀態(tài)(需要 stub_status 模塊)
curl http://127.0.0.1/nginx_status

5.2 性能監(jiān)控

5.2.1 stub_status 模塊

# /etc/nginx/conf.d/status.conf - 監(jiān)控狀態(tài)頁

server {
  listen 127.0.0.1:8080; # 只監(jiān)聽本地,不對外暴露
  server_name localhost;

  location /nginx_status {
    stub_status;
    access_log off;

    # 只允許本機和監(jiān)控服務(wù)器訪問
    allow 127.0.0.1;
    allow 10.0.1.0/24;
    deny all;
  }
}
# stub_status 輸出示例及含義
# Active connections: 291    # 當(dāng)前活躍連接數(shù)
# server accepts handled requests
# 16630948 16630948 31070465  # 總接受連接數(shù) / 總處理連接數(shù) / 總請求數(shù)
# Reading: 6 Writing: 179 Waiting: 106
# Reading: 正在讀取請求頭的連接數(shù)
# Writing: 正在向客戶端發(fā)送響應(yīng)的連接數(shù)
# Waiting: keepalive 空閑連接數(shù)(等待下一個請求)

5.2.2 Prometheus + nginx-exporter 監(jiān)控

# 安裝 nginx-prometheus-exporter
wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v1.3.0/nginx-prometheus-exporter_1.3.0_linux_amd64.tar.gz
tar -xzf nginx-prometheus-exporter_1.3.0_linux_amd64.tar.gz

# 啟動 exporter(讀取 stub_status 并轉(zhuǎn)換為 Prometheus 格式)
./nginx-prometheus-exporter 
  -nginx.scrape-uri=http://127.0.0.1:8080/nginx_status 
  -web.listen-address=:9113
# /etc/prometheus/rules/nginx.yml - Prometheus 告警規(guī)則

groups:
-name:nginx
 rules:
  -alert:NginxHighActiveConnections
   expr:nginx_connections_active>10000
   for:5m
   labels:
    severity:warning
   annotations:
    summary:"Nginx 活躍連接數(shù)過高"
    description:"當(dāng)前活躍連接數(shù){{ $value }},超過閾值 10000"

  -alert:NginxHighErrorRate
   # 5xx 錯誤率超過 5%
   expr:rate(nginx_http_requests_total{status=~"5.."}[5m])/rate(nginx_http_requests_total[5m])>0.05
   for:2m
   labels:
    severity:critical
   annotations:
    summary:"Nginx 5xx 錯誤率過高"

5.2.3 關(guān)鍵指標與告警閾值

指標名稱 正常范圍 告警閾值 說明
活躍連接數(shù) < 5000 > 10000 接近 worker_connections 上限時需擴容
請求處理時間 < 200ms > 1000ms P99 超過1秒需排查上游或緩存
5xx 錯誤率 < 0.1% > 1% 上游服務(wù)異常的直接體現(xiàn)
上游響應(yīng)時間 < 100ms > 500ms 上游服務(wù)性能問題
緩存命中率 > 80% < 50% 緩存策略需要優(yōu)化
連接等待數(shù)(Waiting) < 1000 > 5000 keepalive 連接過多,可能需要調(diào)小 keepalive_timeout

5.3 備份與恢復(fù)

5.3.1 配置備份腳本

# /opt/scripts/nginx-backup.sh - Nginx 配置備份腳本
#!/bin/bash
set-euo pipefail

BACKUP_DIR="/opt/backups/nginx"
NGINX_CONF_DIR="/etc/nginx"
RETENTION_DAYS=30
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/nginx_conf_${TIMESTAMP}.tar.gz"

backup_nginx_config() {
  mkdir -p"${BACKUP_DIR}"

 # 打包 Nginx 配置目錄
  tar -czf"${BACKUP_FILE}"
    --exclude="${NGINX_CONF_DIR}/ssl/*.key" # 私鑰單獨備份,不放在普通備份中
   "${NGINX_CONF_DIR}"

 echo"備份完成:${BACKUP_FILE}"
 echo"備份大?。?(du -sh "${BACKUP_FILE}" | cut -f1)"
}

cleanup_old_backups() {
 # 刪除超過保留期的備份文件
  find"${BACKUP_DIR}"-name"nginx_conf_*.tar.gz"
    -mtime"+${RETENTION_DAYS}"-delete

 echo"已清理${RETENTION_DAYS}天前的備份"
}

verify_backup() {
 # 驗證備份文件完整性
 iftar -tzf"${BACKUP_FILE}"> /dev/null 2>&1;then
   echo"備份驗證通過"
 else
   echo"備份文件損壞!">&2
   exit1
 fi
}

backup_nginx_config
verify_backup
cleanup_old_backups

5.3.2 灰度發(fā)布與配置回滾

# /opt/scripts/nginx-deploy.sh - 配置灰度發(fā)布腳本
#!/bin/bash
set-euo pipefail

NGINX_CONF_DIR="/etc/nginx"
BACKUP_DIR="/opt/backups/nginx"

deploy_config() {
 localnew_config_dir="$1"
 localtimestamp
  timestamp=$(date +%Y%m%d_%H%M%S)

 # 備份當(dāng)前配置
  cp -r"${NGINX_CONF_DIR}""${BACKUP_DIR}/nginx_conf_before_deploy_${timestamp}"
 echo"當(dāng)前配置已備份到:${BACKUP_DIR}/nginx_conf_before_deploy_${timestamp}"

 # 復(fù)制新配置
  rsync -av --delete"${new_config_dir}/""${NGINX_CONF_DIR}/"

 # 測試新配置語法
 if! nginx -t;then
   echo"新配置語法錯誤,回滾...">&2
    rsync -av --delete"${BACKUP_DIR}/nginx_conf_before_deploy_${timestamp}/""${NGINX_CONF_DIR}/"
   exit1
 fi

 # 熱重載(不中斷現(xiàn)有連接)
  nginx -s reload
 echo"配置部署成功,已熱重載"
}

rollback_config() {
 localbackup_path="$1"

 if[ ! -d"${backup_path}"];then
   echo"備份目錄不存在:${backup_path}">&2
   exit1
 fi

  rsync -av --delete"${backup_path}/""${NGINX_CONF_DIR}/"

 ifnginx -t && nginx -s reload;then
   echo"回滾成功"
 else
   echo"回滾失敗,請手動檢查配置">&2
   exit1
 fi
}

case"${1:-}"in
  deploy)  deploy_config"${2}";;
  rollback) rollback_config"${2}";;
  *)    echo"用法:$0{deploy |rollback }";;
esac

六、總結(jié)

6.1 技術(shù)要點回顧

worker 配置:worker_processes auto+worker_cpu_affinity auto+worker_rlimit_nofile 65536,三者配合才能充分利用多核并支撐高并發(fā)

內(nèi)核參數(shù):somaxconn、tcp_tw_reuse、file-max是必須調(diào)整的三個參數(shù),不調(diào)整會在中等流量下觸發(fā)瓶頸

反向代理:proxy_http_version 1.1+proxy_set_header Connection ""+keepalive是啟用上游長連接的完整組合,缺一不可

緩存設(shè)計:proxy_cache_use_stale配置上游降級策略,proxy_cache_lock防止緩存擊穿,proxy_cache_background_update避免緩存過期時的流量尖刺

TLS 優(yōu)化:TLS 1.3 + OCSP Stapling + 會話緩存,三者疊加可將 TLS 握手延遲降低 50% 以上

6.2 進階學(xué)習(xí)方向

OpenResty / njs:在 Nginx 中嵌入 Lua 或 JavaScript 邏輯,實現(xiàn) JWT 驗證、動態(tài)路由、A/B 測試等 API 網(wǎng)關(guān)功能,無需引入獨立網(wǎng)關(guān)組件

Nginx Unit:Nginx 官方的應(yīng)用服務(wù)器,支持動態(tài)配置(無需重載),可直接運行 Python/PHP/Node.js 應(yīng)用,適合替代 uWSGI/Gunicorn

eBPF + Nginx:使用 eBPF 在內(nèi)核層面監(jiān)控 Nginx 的網(wǎng)絡(luò)行為,實現(xiàn)零侵入的性能分析和安全審計

6.3 參考資料

Nginx 官方文檔- 權(quán)威參考,指令說明以此為準

Nginx 源碼- 理解內(nèi)部實現(xiàn)的最直接途徑

nginx-prometheus-exporter- 官方 Prometheus 集成

Mozilla SSL Configuration Generator- TLS 配置生成工具,覆蓋主流瀏覽器兼容性

附錄

A. 命令速查表

# 配置測試與重載
nginx -t             # 測試配置文件語法
nginx -T             # 測試并輸出完整配置(含 include 文件)
nginx -s reload         # 熱重載配置(不中斷連接)
nginx -s reopen         # 重新打開日志文件(日志切割后使用)
nginx -s quit          # 優(yōu)雅停止(等待現(xiàn)有請求完成)
nginx -s stop          # 立即停止

# 進程管理
systemctl start nginx      # 啟動
systemctl stop nginx       # 停止
systemctl reload nginx      # 重載(等同于 nginx -s reload)
systemctl status nginx      # 查看狀態(tài)

# 日志分析
tail -f /var/log/nginx/error.log # 實時查看錯誤日志
nginx -V 2>&1 | tr' ''
'   # 查看編譯參數(shù)

# 連接狀態(tài)
ss -tn state established dst :80 # 查看到80端口的連接
ss -s              # 連接統(tǒng)計摘要
curl http://127.0.0.1/nginx_status# 查看 stub_status

# 緩存管理
find /data/nginx/cache -typef | wc -l # 統(tǒng)計緩存文件數(shù)量
du -sh /data/nginx/cache        # 查看緩存占用空間

B. 配置參數(shù)詳解

參數(shù) 默認值 推薦值 說明
worker_processes 1 auto worker 進程數(shù),auto 自動匹配 CPU 核數(shù)
worker_connections 512 16384 單 worker 最大連接數(shù)
worker_rlimit_nofile 系統(tǒng)默認 65536 worker 進程文件描述符上限
keepalive_timeout 75s 65s 客戶端 keepalive 超時
proxy_connect_timeout 60s 5s 與上游建立連接超時
proxy_read_timeout 60s 60s 等待上游響應(yīng)超時
client_max_body_size 1m 10m-100m 請求體大小限制
gzip_comp_level 1 6 壓縮級別,6 是性能與壓縮率平衡點
proxy_cache_lock off on 防止緩存擊穿
open_file_cache max - 10000 文件描述符緩存條目數(shù)

C. 術(shù)語表

術(shù)語 英文 解釋
反向代理 Reverse Proxy 代表后端服務(wù)接收客戶端請求,客戶端不直接訪問后端
負載均衡 Load Balancing 將流量分發(fā)到多個后端實例,提升吞吐量和可用性
上游 Upstream Nginx 轉(zhuǎn)發(fā)請求的目標服務(wù)器或服務(wù)器組
緩存擊穿 Cache Breakdown 熱點 key 過期瞬間大量請求同時穿透到上游
緩存穿透 Cache Penetration 請求不存在的數(shù)據(jù),每次都穿透緩存打到上游
驚群效應(yīng) Thundering Herd 多個進程/線程同時被喚醒競爭同一資源
前向保密 Forward Secrecy 即使私鑰泄露,歷史會話數(shù)據(jù)也無法被解密
OCSP 裝訂 OCSP Stapling 服務(wù)端預(yù)先獲取證書吊銷狀態(tài)并附在 TLS 握手中
零拷貝 Zero-Copy 數(shù)據(jù)在內(nèi)核態(tài)直接傳輸,不經(jīng)過用戶態(tài)緩沖區(qū)
事件驅(qū)動 Event-Driven 通過事件通知機制處理 I/O,而非為每個連接分配線程

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    14

    文章

    10261

    瀏覽量

    91526
  • 負載均衡
    +關(guān)注

    關(guān)注

    0

    文章

    133

    瀏覽量

    12880
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    186

    瀏覽量

    13124

原文標題:Nginx高性能配置:反向代理、負載均衡與緩存優(yōu)化

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Linux上Nginx獲得最佳性能的8種方法

    NGINX 是一種流行的、免費的開源 Web 服務(wù)器。默認的 NGINX 配置足以讓 Web 服務(wù)器正常工作。 但是,如果您想充分利用 NGINX,則需要使用其
    發(fā)表于 01-16 09:51 ?844次閱讀

    nginx重啟命令linux步驟是什么?

      1、驗證nginx配置文件是否正確   方法一:進入nginx安裝目錄sbin下,輸入命令./nginx -t   看到如下顯示nginx
    發(fā)表于 07-10 16:40

    nginx重啟命令linux步驟是什么?

      1、驗證nginx配置文件是否正確   方法一:進入nginx安裝目錄sbin下,輸入命令./nginx -t   看到如下顯示nginx
    發(fā)表于 07-11 17:13

    nginx中的sendfile配置說明

    nginx配置sendfile及詳細說明
    發(fā)表于 05-05 08:08

    Centos7Nginx安裝與配置步驟

    Centos7 Nginx安裝與配置,防火墻開啟端口監(jiān)聽
    發(fā)表于 06-02 12:58

    nginx錯誤頁面配置

    16、nginx 錯誤頁面配置nginx錯誤頁面包括404 403 500 502 503 504等頁面,只需要在server中增加以下配置即可: error_page404 403
    發(fā)表于 07-26 06:54

    主要學(xué)習(xí)下nginx的安裝配置

    處理。因為有了中間件,使得大型網(wǎng)站在規(guī)劃有了更好的層次性,維護上更加方便。也可以實現(xiàn)負載均衡、安全防護等。Nginx是一個開源高性能、可靠的HTTP中間件、代理服務(wù),在目前企業(yè)中得到了很大的利用。今天
    發(fā)表于 10-19 14:12

    ECS配置lnmp的詳細步驟資料說明

    本文檔詳細介紹的是ECS配置lnmp的詳細步驟資料說明主要內(nèi)容包括了:一、停止甚至刪除系統(tǒng)上現(xiàn)有的web服務(wù)器軟件,二、安裝開發(fā)包和庫文件,三、安裝
    發(fā)表于 03-04 15:48 ?6次下載
    ECS<b class='flag-5'>配置</b>lnmp的<b class='flag-5'>詳細</b><b class='flag-5'>步驟</b>資料說明

    分析Nginx為什么快的原因

    Nginx 以其高性能,穩(wěn)定性,豐富的功能,簡單的配置和低資源消耗而聞名。本文從底層原理分析 Nginx 為什么這么快!
    的頭像 發(fā)表于 05-04 14:26 ?3116次閱讀
    分析<b class='flag-5'>Nginx</b>為什么快的原因

    Nginx詳細知識點講解

    Nginx是一個高性能的HTTP和反向代理服務(wù)器,特點是占用內(nèi)存少,并發(fā)能力強,事實上nginx的并發(fā)能力確實在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好 nginx專為
    的頭像 發(fā)表于 12-26 10:25 ?3316次閱讀
    <b class='flag-5'>Nginx</b>的<b class='flag-5'>詳細</b>知識點講解

    詳解Nginx高性能的HTTP和反向代理服務(wù)器

    Nginx 是一個高性能的 HTTP 和反向代理服務(wù)器,特點是占用內(nèi)存少,并發(fā)能力強,事實上 Nginx 的并發(fā)能力確實在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好。
    的頭像 發(fā)表于 03-16 11:23 ?3217次閱讀

    Nginx的特點和作用 Nginx常用命令和核心配置

    Nginx 是開源、高性能、高可靠的 Web 和反向代理服務(wù)器,而且支持熱部署,幾乎可以做到 7 * 24 小時不間斷運行,即使運行幾個月也不需要重新啟動,還能在不間斷服務(wù)的情況下對軟件版本進行熱
    的頭像 發(fā)表于 09-01 09:53 ?1529次閱讀
    <b class='flag-5'>Nginx</b>的特點和作用 <b class='flag-5'>Nginx</b>常用命令和核心<b class='flag-5'>配置</b>

    Nginx 如何實現(xiàn)高性能低消耗

    Nginx具有豐富的模塊庫、靈活的配置、較低資源消耗等優(yōu)點。下面,我們一起深入看一下Nginx的工作機制 1. Nginx 如何實現(xiàn)高性能
    的頭像 發(fā)表于 11-11 11:31 ?1205次閱讀
    <b class='flag-5'>Nginx</b> 如何實現(xiàn)<b class='flag-5'>高性能</b>低消耗

    nginx負載均衡配置介紹

    目錄 nginx負載均衡 nginx負載均衡介紹 反向代理與負載均衡 nginx負載均衡配置 Keepalived高可用nginx負載均衡器
    的頭像 發(fā)表于 11-10 13:39 ?1572次閱讀
    <b class='flag-5'>nginx</b>負載均衡<b class='flag-5'>配置</b>介紹

    Nginx配置終極指南

    Nginx 是開源、高性能、高可靠的 Web 和反向代理服務(wù)器,而且支持熱部署,幾乎可以做到 7 * 24 小時不間斷運行,即使運行幾個月也不需要重新啟動,還能在不間斷服務(wù)的情況下對軟件版本進行熱
    的頭像 發(fā)表于 06-18 15:56 ?1040次閱讀
    <b class='flag-5'>Nginx</b><b class='flag-5'>配置</b>終極指南