11 個 Nginx 引數效能優化工作

2021-09-12 23:46:57 字數 4850 閱讀 5114

工作上,需要配置 nginx,要投入生產使用,做了一點優化工作,加上以前也經常折騰 nginx,故記下一些優化工作。

優化 nginx 程序數量

配置引數如下:

worker_processes 1; # 指定 nginx 要開啟的程序數,結尾的數字就是程序的個數,可以為 auto
這個引數調整的是 nginx 服務的 worker 程序數,nginx 有 master 程序和 worker 程序之分,master 為管理程序、真正接待「顧客」的是 worker 程序。

程序個數的策略:worker 程序數可以設定為等於 cpu 的核數。高流量高併發場合也可以考慮將程序數提高至 cpu 核數 x 2。這個引數除了要和 cpu 核數匹配之外,也與硬碟儲存的資料及系統的負載有關,設定為 cpu 核數是個好的起始配置,也是官方建議的。

當然,如果想省麻煩也可以配置為worker_processes auto;,將由 nginx 自行決定 worker 數量。當訪問量快速增加時,nginx 就會臨時 fork 新程序來縮短系統的瞬時開銷和降低服務的時間。

將不同的程序繫結到不同的cpu

預設情況下,nginx 的多個程序有可能執行在同乙個 cpu 核上,導致 nginx 程序使用硬體的資源不均,這就需要制定程序分配到指定的 cpu 核上處理,達到充分有效利用硬體的目的。配置引數如下:

worker_processes 4;

worker_cpu_affinity 0001 0010 0100 1000;

其中worker_cpu_affinity就是配置 nginx 程序與 cpu 親和力的引數,即把不同的程序分給不同的 cpu 核處理。這裡的0001 0010 0100 1000是掩碼,分別代表第1、2、3、4核cpu。上述配置會為每個程序分配一核cpu處理。

當然,如果想省麻煩也可以配置worker_cpu_affinity auto;,將由 nginx 按需自動分配。

nginx 事件處理模型優化

nginx 的連線處理機制在不同的作業系統中會採用不同的 i/o 模型,在 linux 下,nginx 使用 epoll 的 i/o 多路復用模型,在 freebsd 中使用 kqueue 的 i/o 多路復用模型,在 solaris 中使用 /dev/poll 方式的 i/o 多路復用模型,在 windows 中使用 icop,等等。

配置如下:

events
events指令是設定 nginx 的工作模式及連線數上限。use指令用來指定 nginx 的工作模式。nginx 支援的工作模式有 select、 poll、 kqueue、 epoll 、 rtsig 和/ dev/poll。當然,也可以不指定事件處理模型,nginx 會自動選擇最佳的事件處理模型。

單個程序允許的客戶端最大連線數

通過調整控制連線數的引數來調整 nginx 單個程序允許的客戶端最大連線數。

events
worker_connections也是個事件模組指令,用於定義 nginx 每個程序的最大連線數,預設是 1024。

最大連線數的計算公式如下:

max_clients = worker_processes * worker_connections;

如果作為反向**,因為瀏覽器缺省會開啟 2 個連線到 server,而且 nginx 還會使用fds(file descriptor)從同乙個連線池建立連線到 upstream 後端。則最大連線數的計算公式如下:

max_clients = worker_processes * worker_connections / 4;

另外,程序的最大連線數受 linux 系統程序的最大開啟檔案數限制,在執行作業系統命令ulimit -hsn 65535或配置相應檔案後,worker_connections的設定才能生效。

配置獲取更多連線數

預設情況下,nginx 程序只會在乙個時刻接收乙個新的連線,我們可以配置multi_accepton,實現在乙個時刻內可以接收多個新的連線,提高處理效率。該引數預設是off,建議開啟。

events
配置 worker 程序的最大開啟檔案數

調整配置 nginx worker 程序的最大開啟檔案數,這個控制連線數的引數為worker_rlimit_nofile。該引數的實際配置如下:

worker_rlimit_nofile 65535;
可設定為系統優化後的ulimit -hsn的結果

優化網域名稱的雜湊表大小

http
引數作用:設定存放網域名稱( server names)的最大雜湊表的儲存桶( bucket)的大小。 預設值依賴 cpu 的快取行。

server_names_hash_bucket_size的值是不能帶單位 的。配置主機時必須設定該值,否則無法執行 nginx,或者無法通過測試 。 該設定與server_ names_hash_max_size共同控制儲存伺服器名的 hash 表, hash bucket size 總是等於 hash 表的大小, 並且是一路處理器快取大小的倍數。若 hash bucket size 等於一路處理器快取的大小,那麼在查詢鍵時, 最壞的情況下在記憶體中查詢的次數為 2。第一次是確定儲存單元的位址,第二次是在儲存單元中查詢鍵值 。 若報 出 hash max size 或 hash bucket size 的提示,則需要增加server_names_hash_max size的值。

tcp 優化

http
第一行的sendfile配置可以提高 nginx 靜態資源託管效率。sendfile 是乙個系統呼叫,直接在核心空間完成檔案傳送,不需要先 read 再 write,沒有上下文切換開銷。

tcp_nopush 是 freebsd 的乙個 socket 選項,對應 linux 的 tcp_cork,nginx 裡統一用tcp_nopush來控制它,並且只有在啟用了sendfile之後才生效。啟用它之後,資料報會累計到一定大小之後才會傳送,減小了額外開銷,提高網路效率。

tcp_nodelay 也是乙個 socket 選項,啟用後會禁用 nagle 演算法,盡快傳送資料,某些情況下可以節約 200ms(nagle 演算法原理是:在發出去的資料還未被確認之前,新生成的小資料先存起來,湊滿乙個 mss 或者等到收到確認後再傳送)。nginx 只會針對處於 keep-alive 狀態的 tcp 連線才會啟用tcp_nodelay

優化連線引數

http
這部分更多是更具業務場景來決定的。例如client_max_body_size用來決定請求體的大小,用來限制上傳檔案的大小。上面列出的引數可以作為起始引數。

配置壓縮優化

9.1、gzip 壓縮

我們在上線前,**(js、css 和 html)會做壓縮,也會做壓縮(pngout、pngcrush、jpegoptim、gifsicle 等)。對於文字檔案,在服務端傳送響應之前進行 gzip 壓縮也很重要,通常壓縮後的文字大小會減小到原來的 1/4 - 1/3。

http
這部分內容比較簡單,只有兩個地方需要解釋下:

gzip_vary用來輸出 vary 響應頭,用來解決某些快取服務的乙個問題,詳情請看我之前的部落格:http 協議中 vary 的一些研究。

gzip_disable指令接受乙個正規表示式,當請求頭中的 useragent 字段滿足這個正則時,響應不會啟用 gzip,這是為了解決在某些瀏覽器啟用 gzip 帶來的問題。

預設 nginx 只會針對 http/1.1 及以上的請求才會啟用 gzip,因為部分早期的 http/1.0 客戶端在處理 gzip 時有 bug。現在基本上可以忽略這種情況,於是可以指定 gzip_http_version 1.0 來針對 http/1.0 及以上的請求開啟 gzip。

9.2、brotli 壓縮

brotli 是基於lz77演算法的乙個現代變體、霍夫曼編碼和二階上下文建模。google軟體工程師在2023年9月發布了包含通用無損資料壓縮的brotli增強版本,特別側重於http壓縮。其中的編碼器被部分改寫以提高壓縮比,編碼器和解碼器都提高了速度,流式api已被改進,增加更多壓縮質量級別。

需要安裝libbrotlingx_brotli,重新編譯 nginx 時,帶上--add-module=/path/to/ngx_brotli即可,然後配置如下

http
brotli 可與 gzip 共存在乙個配置檔案中

靜態資源優化

靜態資源優化,可以減少連線請求數,同時也不需要對這些資源請求列印日誌。但***是資源更新可能無法及時。

server 

# 字型

location ~ .*\.(eot|ttf|otf|woff|svg)$

# js、css

location ~ .*\.(js|css)?$

}

收官~

首發於

nginx引數詳解與效能優化

user 指定nginx worker程序的使用者以及使用者組 work processes 是個主模組指令,制定了nginx要開啟的程序數。每個nginx程序平均耗費10m 12m記憶體 根據經驗一般設定乙個程序足夠了 如果是多核cpu 建議指定和cpu數量一樣多的程序數 error log 是個...

6個SQL Server 2005效能優化工具介紹

圖形化實時監視工具 可以檢視資料庫上的任何操作的記錄,包括讀 寫統計,cpu使用統計,索引和表的掃瞄,執行計畫和其他統計資訊,以便我們優化sql 和 t sql 分布式回放 分布式回放是乙個包含在sql server 2012產品中的全新工具,我們可以通過它進行可擴充套件性測試或者估量硬體或者作業系...

Nginx效能優化

在http裡面新增一行 server tokens off 預設可以設定為cpu的核數相等,併發比較大的時候,可以設定為cpu核數 2 worker cpu affinity 0001 0010 0100 1000 四核worker cpu affinity 00000001 00000010 00...