Ubuntu 22.04 Nginx 效能調校

Ubuntu 22.04 Nginx Performance Tuning

Nginx 是一款以高效能著稱的網頁伺服器,但預設配置並非針對所有場景優化。本文將深入介紹如何在 Ubuntu 22.04 上對 Nginx 進行效能調校,以發揮其最大潛力。

Nginx 效能概述

Nginx 採用事件驅動的非同步架構,相較於傳統的多執行緒模型,能夠以更少的資源處理更多的並發連線。效能調校的主要目標包括:

  • 提升每秒請求處理量(RPS)
  • 降低回應延遲
  • 減少記憶體與 CPU 使用率
  • 提高系統穩定性

在開始調校前,建議先備份原始設定檔:

1
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup

Worker 程序設定

Worker 程序是 Nginx 處理請求的核心。在 /etc/nginx/nginx.conf 中進行設定:

1
2
3
4
5
6
7
8
# Worker 程序數量,建議設為 CPU 核心數
worker_processes auto;

# 綁定 Worker 到特定 CPU 核心(可選)
worker_cpu_affinity auto;

# 每個 Worker 可開啟的最大檔案描述符數量
worker_rlimit_nofile 65535;

查看系統 CPU 核心數:

1
2
3
nproc
# 或
cat /proc/cpuinfo | grep processor | wc -l

連線處理優化

events 區塊中設定連線處理參數:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
events {
    # 每個 Worker 的最大連線數
    worker_connections 4096;

    # 使用 epoll 事件模型(Linux 專用,效能最佳)
    use epoll;

    # 允許一次接受多個連線
    multi_accept on;
}

計算理論最大連線數:

  • 最大連線數 = worker_processes × worker_connections
  • 例如:4 × 4096 = 16,384 個同時連線

緩衝區設定

適當的緩衝區大小可以減少磁碟 I/O,提升效能:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
http {
    # 客戶端請求緩衝區
    client_body_buffer_size 16k;
    client_header_buffer_size 1k;
    client_max_body_size 8m;
    large_client_header_buffers 4 8k;

    # 代理緩衝區(用於反向代理場景)
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;

    # FastCGI 緩衝區(用於 PHP-FPM)
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
}

Gzip 壓縮

啟用 Gzip 壓縮可顯著減少傳輸資料量:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
http {
    # 啟用 Gzip 壓縮
    gzip on;

    # 最小壓縮檔案大小(小於此值不壓縮)
    gzip_min_length 1024;

    # 壓縮等級(1-9,建議 4-6)
    gzip_comp_level 5;

    # 壓縮的 MIME 類型
    gzip_types
        text/plain
        text/css
        text/javascript
        text/xml
        application/json
        application/javascript
        application/xml
        application/xml+rss
        application/x-javascript
        image/svg+xml;

    # 為代理請求啟用壓縮
    gzip_proxied any;

    # 在回應標頭加入 Vary: Accept-Encoding
    gzip_vary on;

    # 停用 IE6 的 Gzip(相容性考量)
    gzip_disable "msie6";
}

靜態檔案快取

利用瀏覽器快取減少重複請求:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
    # 靜態資源快取設定
    location ~* \.(jpg|jpeg|png|gif|ico|webp)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    location ~* \.(css|js)$ {
        expires 7d;
        add_header Cache-Control "public";
        access_log off;
    }

    location ~* \.(woff|woff2|ttf|otf|eot)$ {
        expires 365d;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    location ~* \.(pdf|doc|docx|xls|xlsx)$ {
        expires 7d;
        add_header Cache-Control "public";
    }
}

開啟檔案快取

快取開啟的檔案描述符以減少系統呼叫:

1
2
3
4
5
6
7
http {
    # 開啟檔案快取
    open_file_cache max=10000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
}

參數說明:

  • max:快取的最大檔案數量
  • inactive:檔案在快取中保留的時間
  • valid:驗證快取項目的間隔
  • min_uses:在 inactive 時間內被存取的最少次數

TCP 優化

優化 TCP 連線參數提升網路效能:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
http {
    # 啟用 sendfile 系統呼叫
    sendfile on;

    # 配合 sendfile 使用,優化資料傳輸
    tcp_nopush on;

    # 禁用 Nagle 演算法,降低延遲
    tcp_nodelay on;

    # Keep-Alive 連線設定
    keepalive_timeout 65;
    keepalive_requests 1000;

    # 連線超時設定
    client_body_timeout 12;
    client_header_timeout 12;
    send_timeout 10;

    # 重置超時連線
    reset_timedout_connection on;
}

同時需要調整系統核心參數,編輯 /etc/sysctl.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 增加可用的本地端口範圍
net.ipv4.ip_local_port_range = 1024 65535

# 增加 TCP 最大連線數
net.core.somaxconn = 65535

# 增加網路佇列長度
net.core.netdev_max_backlog = 65535

# TCP 緩衝區設定
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 啟用 TCP Fast Open
net.ipv4.tcp_fastopen = 3

# 重複使用 TIME_WAIT 連線
net.ipv4.tcp_tw_reuse = 1

套用設定:

1
sudo sysctl -p

完整設定範例

以下是一份完整的效能優化設定範例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
user www-data;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;

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

http {
    # 基本設定
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    charset utf-8;

    # 日誌設定
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;

    # TCP 優化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # 連線設定
    keepalive_timeout 65;
    keepalive_requests 1000;
    client_body_timeout 12;
    client_header_timeout 12;
    send_timeout 10;
    reset_timedout_connection on;

    # 緩衝區設定
    client_body_buffer_size 16k;
    client_header_buffer_size 1k;
    client_max_body_size 8m;
    large_client_header_buffers 4 8k;

    # 開啟檔案快取
    open_file_cache max=10000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

    # Gzip 壓縮
    gzip on;
    gzip_min_length 1024;
    gzip_comp_level 5;
    gzip_types text/plain text/css text/javascript text/xml
               application/json application/javascript
               application/xml application/xml+rss
               image/svg+xml;
    gzip_proxied any;
    gzip_vary on;
    gzip_disable "msie6";

    # 載入站台設定
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

基準測試

使用 ab(Apache Benchmark)或 wrk 進行效能測試:

安裝測試工具:

1
2
3
4
5
# Apache Benchmark
sudo apt install apache2-utils -y

# wrk
sudo apt install wrk -y

使用 ab 進行測試:

1
2
# 模擬 1000 個請求,100 個並發
ab -n 1000 -c 100 http://localhost/

使用 wrk 進行測試:

1
2
# 12 執行緒,400 連線,持續 30 秒
wrk -t12 -c400 -d30s http://localhost/

測試結果解讀:

  • Requests per second:每秒處理的請求數(RPS)
  • Time per request:每個請求的平均處理時間
  • Transfer rate:資料傳輸速率

驗證設定並重新載入:

1
2
3
4
5
# 測試設定檔語法
sudo nginx -t

# 重新載入設定
sudo systemctl reload nginx

效能調校建議

根據不同場景的調校建議:

場景建議設定
靜態網站加大 open_file_cache,啟用 sendfile
API 服務減小 buffer size,啟用 tcp_nodelay
反向代理加大 proxy_buffers,啟用 upstream keepalive
高流量網站增加 worker_connections,調整系統核心參數

參考資料

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy