Nginx效能調優5招35式不可不知的策略實戰

威哥爱编程發表於2024-07-08

Nginx是一個高效能的HTTP和反向代理伺服器,它在全球範圍內被廣泛使用,因其高效能、穩定性、豐富的功能以及低資源消耗而受到青睞。今天V哥從5個方面來介紹 Nginx 效能調優的具體策略,希望對兄弟們有幫助,廢話不多說,馬上開整。

1. 系統層面:

  • 調整核心引數:例如,增加系統檔案描述符的限制、TCP連線佇列的大小等。
  • 網路最佳化:可以使用TCP Fast Open、選擇更高效的網路協議等。

2. Nginx配置:

  • Worker程序數:通常設定為等於伺服器的CPU核心數。
  • 連線數:透過調整worker_connections引數,可以增加每個Worker程序可以開啟的連線數。
  • 使用HTTP/2:HTTP/2提供了更好的效能,包括頭部壓縮和伺服器推送等功能。

3. 快取利用:

  • 啟用檔案快取:Nginx可以將靜態檔案快取在伺服器本地,減少磁碟I/O操作。
  • 使用代理快取:例如,使用Nginx作為反向代理伺服器時,可以快取後端伺服器的響應內容。

4. 壓縮:

  • 啟用Gzip壓縮可以減少資料傳輸量,提高響應速度。

5. 負載均衡策略:

  • 根據伺服器的效能和負載情況,選擇合適的負載均衡策略,如輪詢、最少連線數、IP雜湊等。

下面 V 哥針對每個點結合業務場景來詳細介紹,老鐵們坐穩了,要發車了。

1. 系統層面

Nginx效能調優可以從多個層面進行,這裡我們重點討論系統層面的調優步驟。系統層面的調優主要是對作業系統進行最佳化,以更好地支援Nginx的高併發處理能力。

1. 核心引數調整

核心引數的調整可以透過修改/etc/sysctl.conf檔案來實現,這些引數會影響網路棧的行為。

  • net.core.somaxconn:這個引數設定了一個系統範圍內所有監聽Socket的未完成連線佇列的最大長度。調高這個值可以避免在高峰期出現"connection refused"的錯誤。
sysctl -w net.core.somaxconn=65535
  • net.ipv4.tcp_max_syn_backlog:這個引數設定了TCP連線建立時,SYN佇列的最大長度。在高負載情況下,增加這個值可以防止SYN洪水攻擊。
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
  • net.ipv4.ip_local_port_range:這個引數定義了本地埠範圍,增加這個範圍可以允許更多的併發連線。
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
  • net.ipv4.tcp_fin_timeout:這個引數決定了系統回收TCP連線的時間。減小這個值可以加快回收速度,釋放資源。
sysctl -w net.ipv4.tcp_fin_timeout=30
  • net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_tw_recycle:這兩個引數控制了TCP連線的TIME_WAIT狀態。開啟它們可以更快地重用和回收處於TIME_WAIT狀態的連線。
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1

2. 檔案描述符限制

增加系統允許的檔案描述符數量,以便Nginx可以開啟更多的連線。

  • 使用者級限制:修改/etc/security/limits.conf檔案,增加Nginx使用者(通常是www-data或nginx)的nofile限制。
nginx soft nofile 65535
nginx hard nofile 65535
  • 系統級限制:修改/proc/sys/fs/file-max檔案,增加整個系統的最大檔案描述符數。
echo 65535 > /proc/sys/fs/file-max

3. 網路棧最佳化

  • 禁用Syn Cookies:在高峰期,可以臨時禁用Syn Cookies,以提高TCP連線的建立速度。
sysctl -w net.ipv4.tcp_syncookies=0
  • 調整TCP Keepalive:透過調整net.ipv4.tcp_keepalive_time等引數,可以最佳化長連線的管理。
sysctl -w net.ipv4.tcp_keepalive_time=600

4. 硬體和架構最佳化

  • 使用SSD儲存:使用固態硬碟可以顯著提高I/O效能,尤其是對於需要頻繁讀寫檔案的Nginx伺服器。
  • 網路硬體:使用高頻寬和低延遲的網路硬體,如萬兆乙太網,可以提高資料傳輸速度。
  • 負載均衡:如果伺服器面臨極高的負載,可以考慮使用硬體負載均衡器來分擔Nginx的壓力。

5. 作業系統選擇和最佳化

  • 選擇合適的作業系統:不同的作業系統對網路效能的支援不同,選擇一個適合高併發網路服務的作業系統是很有幫助的。
  • 關閉不必要的系統服務:減少系統執行的程序和服務,可以釋放更多的系統資源給Nginx使用。

在進行系統層面的調優時,需要注意平衡效能提升和系統穩定性之間的關係。過度的最佳化可能會導致系統不穩定,甚至出現資源耗盡的情況。因此,建議在調優過程中進行充分的測試,並根據伺服器的具體情況進行調整。

2. Nginx配置

Nginx的效能調優可以透過修改其配置檔案nginx.conf來實現。以下是一些具體的調優步驟和建議:

1. Worker程序數

Nginx使用多程序模型,通常情況下,Worker程序的數量應該設定為等於伺服器的CPU核心數。這樣可以最大化利用多核CPU的效能。

worker_processes auto;  # 或者指定具體的程序數,如 worker_processes 4;

2. Worker連線數

每個Worker程序可以同時處理的最大連線數由worker_connections指令設定。這個值應該根據伺服器的記憶體大小和系統負載來合理設定。

events {
    worker_connections  4096;  # 根據伺服器能力適當調整
}

3. 使用HTTP/2

如果客戶端支援,可以啟用HTTP/2,它提供了更好的效能,包括頭部壓縮和伺服器推送等功能。

listen 443 ssl http2;

4. 檔案描述符限制

增加Nginx可以開啟的檔案描述符數量,以處理更多的併發連線。

worker_rlimit_nofile 65535;

5. 啟用Gzip壓縮

壓縮可以減少資料傳輸量,提高響應速度。

gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

6. 快取配置

配置瀏覽器快取,減少重複請求。

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public";
}

7. 靜態資源處理

對於靜態資源,可以使用sendfile快速傳輸檔案。

location /static/ {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay off;
}

8. 負載均衡

如果有多臺後端伺服器,可以使用Nginx的負載均衡功能。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    keepalive 64;  # 保持活動的連線數
}

server {
    location / {
        proxy_pass http://backend;
    }
}

9. 最佳化SSL/TLS

如果使用SSL/TLS,可以最佳化相關配置以提高效能。

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

10. 日誌配置

減少不必要的日誌記錄,可以減少磁碟I/O和CPU使用。

access_log off;  # 或者將日誌寫入記憶體檔案系統

在進行Nginx配置調優時,應該逐步進行,每次更改後都要進行測試,以確保更改確實提高了效能,並且沒有引入新的問題。此外,不同的應用場景可能需要不同的最佳化策略,因此最好根據實際情況進行調整。

3. 快取利用

Nginx快取利用是提高效能的重要手段,它可以透過減少伺服器負載、降低響應時間和減少網路頻寬使用來顯著提升使用者體驗。以下是快取利用的具體調優步驟:

1. 啟用Nginx內建快取

Nginx內建了多種快取機制,如檔案系統快取、記憶體快取等。可以透過配置nginx.conf來啟用這些快取。

  • 檔案系統快取(HTTP快取)

在HTTP模組中,可以使用proxy_cache指令啟用代理快取。

http {
    # 定義快取區域
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        location / {
            proxy_cache my_cache;  # 使用定義的快取區域
            proxy_cache_valid 200 302 10m;  # 對200和302響應快取10分鐘
            proxy_cache_valid 404 1m;  # 對404響應快取1分鐘
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;  # 在指定情況下使用過期快取
        }
    }
}
  • 記憶體快取(FastCGI快取)

如果使用FastCGI(如與PHP-FPM配合),可以使用fastcgi_cache指令啟用快取。

http {
    # 定義FastCGI快取區域
    fastcgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;

    server {
        location ~ \.php$ {
            fastcgi_cache my_cache;  # 使用定義的快取區域
            fastcgi_cache_key $request_uri;  # 定義快取鍵
            fastcgi_cache_valid 200 30m;  # 對200響應快取30分鐘
        }
    }
}

2. 配置瀏覽器快取

透過設定HTTP頭,可以指示瀏覽器快取靜態資源。

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;  # 設定資源的過期時間
    add_header Cache-Control "public";  # 指示資源可以被瀏覽器和代理快取
}

3. 使用CDN

內容分發網路(CDN)可以快取靜態資源,並將其分發到全球各地的節點,使用者可以從最近的節點獲取內容,從而減少延遲。

4. 配置反向代理快取

如果Nginx作為反向代理伺服器,可以配置它來快取後端伺服器的響應。

location / {
    proxy_pass http://backend;
    proxy_cache my_cache;  # 使用定義的快取區域
    proxy_cache_valid 200 30m;  # 對200響應快取30分鐘
}

5. 監控和調整快取效能

  • 使用Nginx的統計模組(如ngx_http_stub_status_module)來監控快取命中率和快取大小。
  • 根據監控資料調整快取大小和過期時間,以最佳化效能。

6. 清理快取

定期清理快取,以釋放空間和提高快取效率。可以使用Nginx的快取清理功能或編寫指令碼來實現。

在進行快取調優時,需要注意以下幾點:

  • 快取大小和過期時間需要根據實際情況進行調整,以找到最佳平衡點。
  • 監控快取命中率,以確保快取配置有效地提高了效能。
  • 確保快取內容的一致性,特別是在動態內容快取時。

透過合理利用快取,可以顯著提高Nginx的效能,減少伺服器負載,並提高使用者體驗。

4. 壓縮

Nginx中的壓縮功能可以透過Gzip模組來實現,它可以在伺服器端對響應資料進行壓縮,以減少傳輸資料的大小,從而提高載入速度,尤其是在頻寬有限的情況下。以下是壓縮的具體調優步驟:

1. 啟用Gzip壓縮

首先,確保在Nginx中啟用了Gzip模組。這通常是透過在nginx.conf檔案的http塊中新增以下指令來完成的:

http {
    gzip on;  # 啟用Gzip壓縮
}

2. 設定壓縮級別

gzip_comp_level指令用於設定壓縮級別,級別越高,壓縮率越大,但CPU消耗也越高。通常設定為1到9之間的值,其中1是最快的壓縮,9是最高壓縮率。推薦設定為6,這是一個效能和壓縮率的平衡點。

http {
    gzip_comp_level 6;  # 設定壓縮級別
}

3. 選擇要壓縮的內容型別

使用gzip_types指令指定要壓縮的MIME型別。通常,文字檔案(如HTML、CSS、JavaScript)和XML檔案可以從壓縮中受益。

http {
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

4. 設定最小壓縮大小

使用gzip_min_length指令設定觸發壓縮的最小檔案大小。對於小檔案,壓縮可能不會帶來太多好處,而且會增加CPU負擔。

http {
    gzip_min_length 256;  # 只有大於256位元組的響應才會被壓縮
}

5. 禁用IE6的壓縮

老版本的IE瀏覽器(IE6及以下)可能不支援Gzip壓縮,可以透過gzip_disable指令禁用對這些瀏覽器的壓縮。

http {
    gzip_disable "MSIE [1-6]\.";  # 禁用IE6及以下版本的Gzip壓縮
}

6. 配置瀏覽器快取

雖然壓縮可以減少伺服器頻寬使用,但它會增加CPU負載。為了減輕伺服器壓力,可以配置瀏覽器快取,讓瀏覽器儲存壓縮後的內容,減少重複請求。

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;  # 設定資源的過期時間
    add_header Cache-Control "public";  # 指示資源可以被瀏覽器和代理快取
}

7. 測試和監控

  • 在應用這些配置後,使用工具如curl或線上Gzip檢測服務來測試壓縮是否生效。
  • 監控伺服器的CPU使用情況和響應時間,以確保壓縮帶來的效能提升大於CPU負載的增加。

透過合理配置Gzip壓縮,可以在不顯著增加伺服器負載的情況下,顯著減少網路傳輸資料的大小,提高使用者體驗。在進行壓縮調優時,需要根據伺服器的CPU能力和網路條件來平衡壓縮級別和最小壓縮大小,以達到最佳的效能。

5. 負載均衡策略

Nginx作為高效能的HTTP和反向代理伺服器,提供了多種負載均衡策略,可以幫助分散流量,提高網站的可用性和效能。以下是負載均衡策略的具體調優步驟:

1. 選擇合適的負載均衡策略

Nginx支援多種負載均衡策略,包括:

  • 輪詢(Round Robin):這是預設的策略,請求按時間順序逐一分配到不同的伺服器,如果伺服器當機,自動剔除。
  • 最少連線(Least Connections):分配到當前連線數最少的伺服器。
  • IP雜湊(IP Hash):根據請求的來源IP地址,將請求分配到固定的伺服器,可以在一定程度上保持使用者的會話狀態。
  • 權重(Weight):指定不同伺服器的權重,權重越高,分配的請求越多。

在nginx.conf的upstream塊中定義負載均衡策略:

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com;
    server backend3.example.com backup;  # 備用伺服器
    ip_hash;  # 使用IP雜湊策略
}

2. 配置健康檢查

使用health_check模組可以對後端伺服器進行健康檢查,以確保流量只被定向到健康的伺服器。

server {
    location / {
        proxy_pass http://backend;
        health_check interval=10 fails=3 passes=2;
    }
}

3. 使用持久連線

對於HTTP/1.1客戶端,可以使用持久連線(Keepalive)來減少建立和關閉連線的次數。

upstream backend {
    server backend1.example.com;
    keepalive 32;  # 保持活動的連線數
}

4. 調整超時時間

適當調整超時時間,以確保Nginx能夠快速響應後端伺服器的變化。

proxy_connect_timeout 5s;  # 設定與後端伺服器建立連線的超時時間
proxy_read_timeout 60s;    # 設定從後端伺服器讀取響應的超時時間
proxy_send_timeout 5s;     # 設定向後端伺服器傳送請求的超時時間

5. 限制連線數

為了避免單個客戶端佔用過多資源,可以限制每個客戶端的連線數。

limit_conn_zone $binary_remote_addr zone=mylimit:10m;
limit_conn mylimit 5;  # 每個IP地址最多允許5個同時連線

6. 監控和調整

  • 使用Nginx的統計模組(如ngx_http_stub_status_module)來監控負載均衡的效能。
  • 根據監控資料調整負載均衡策略和伺服器權重,以最佳化效能。

7. 考慮使用第三方負載均衡解決方案

對於大型應用或需要更多高階功能的場景,可以考慮使用商業負載均衡器或雲服務提供的負載均衡解決方案。

透過合理配置負載均衡策略,可以有效分散流量,提高網站的可用性和效能。在進行負載均衡調優時,需要根據伺服器的具體情況和實際需求來選擇合適的策略,並進行持續的監控和調整。

最後

以上 V 哥總結的5個方面關於 Nginx效能調優的策略,實際應用中需要結合實際專案的情況來測試,希望對你有幫助,歡迎關注威哥愛程式設計,技術路上我們一起成長。

相關文章