11 個 Nginx 參數性能優化工作

工作上,需要配置 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 {use epoll;
}

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

單個進程允許的客戶端最大連接數

通過調整控制連接數的參數來調整 Nginx 單個進程允許的客戶端最大連接數。

events {worker_connections 20480;
}

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 {multi_accept on;
}

配置 worker 進程的最大打開文件數

調整配置 Nginx worker 進程的最大打開文件數,這個控制連接數的參數為 worker_rlimit_nofile。該參數的實際配置如下:

worker_rlimit_nofile 65535;

可設置為系統優化后的 ulimit -HSn 的結果

優化域名的散列表大小

http {server_names_hash_bucket_size 128;
}

參數作用:設置存放域名( 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 on;tcp_nopush on;keepalive_timeout 120;tcp_nodelay on;
}

第一行的 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_header_buffer_size 32k;large_client_header_buffers 4 32k;client_max_body_size 1024m;client_body_buffer_size 10m;
}

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

配置壓縮優化

9.1、Gzip 壓縮

我們在上線前,代碼(JS、CSS 和 HTML)會做壓縮,圖片也會做壓縮(PNGOUT、Pngcrush、JpegOptim、Gifsicle 等)。對于文本文件,在服務端發送響應之前進行 GZip 壓縮也很重要,通常壓縮后的文本大小會減小到原來的 1/4 - 1/3。

http {gzip on;gzip_buffers 16 8k;gzip_comp_level 6;gzip_http_version 1.0;gzip_min_length 1000;gzip_proxied any;gzip_vary on;gzip_typestext/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xmltext/javascript application/javascript application/x-javascripttext/x-json application/json application/x-web-app-manifest+jsontext/css text/plain text/x-componentfont/opentype application/x-font-ttf application/vnd.ms-fontobjectimage/x-icon;gzip_disable "MSIE [1-6]\.(?!.*SV1)";
}

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

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軟件工程師在2015年9月發布了包含通用無損數據壓縮的Brotli增強版本,特別側重于HTTP壓縮。其中的編碼器被部分改寫以提高壓縮比,編碼器和解碼器都提高了速度,流式API已被改進,增加更多壓縮質量級別。

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

http {brotli on;brotli_comp_level 6;brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;
}

Brotli 可與 Gzip 共存在一個配置文件中

靜態資源優化

靜態資源優化,可以減少連接請求數,同時也不需要對這些資源請求打印日志。但副作用是資源更新可能無法及時。

server {# 圖片、視頻location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {expires 30d;access_log off;}# 字體location ~ .*\.(eot|ttf|otf|woff|svg)$ {expires 30d;access_log off;}# js、csslocation ~ .*\.(js|css)?$ {expires 7d;access_log off;}
}

收官~

首發于 https://www.linpx.com

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280619.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280619.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在Windows 8中將舊控制面板添加到Metro Start屏幕

By default there is no way to easily access the old Control Panel in Windows 8, in order to get to it you have to go through the new Metro Control Panel or switch to Explorer. Here’s how to create your own tile for it. 默認情況下,無法輕松訪問Wi…

vue子父組件間傳值

父組件傳值給子組件 props方式   父組件上1處聲明傳遞的鍵并賦值,子組件2處使用props接收一下這個鍵就可以使用了。在父組件改變這個值的話子組件跟著一起響應,子組件改變這個值的話父組件不改變。次為響應式,但是也僅限于父組件的值變化子…

Django07:模板語法/標簽/inclusion_tag/模版的繼承

模板語法傳值 列表:l[a,b,c] 集合:se{‘a’,yy,ss} 元組:t(111,222,333) render(request.index,html,locals()) 語法規律 {{}}:變量相關 {%%}:邏輯相關 {{func}} 會自動加括號執行,但不支持帶參數; 帶參數會不…

紅象云騰發布新一代PB級高速大數據平臺產品

ZD至頂網服務器頻道 03月23日 新聞消息:在3月19日舉辦的China Hadoop Summit(中國Hadoop技術峰會)上,中國Hadoop大數據廠商紅象云騰與OpenPOWER基金會共同發布紅象云騰的新一代大數據產品,幫助企業高速處理PB規模數據。 此次發布…

個人筆記 Vue.js, Framework7, and Cordova / PhoneGap Template with Babel, Webpack and Hot Reloading...

為什么80%的碼農都做不了架構師?>>> 模板創建項目 模板地址 更新package.json中的dependencies依賴到最新版本 當新建一個項目的時候,從其他項目的package.json里面copy一份dependencies過來。 但因為是新項目,我們想用各個依賴包…

dotnet-exec 0.12.0 released

dotnet-exec 0.12.0 releasedIntrodotnet-exec 是一個 C# 程序的小工具,可以用來運行一些簡單的 C# 程序而無需創建項目文件,讓 C# 像 python/nodejs 一樣簡單,而且可以自定義項目的入口方法,支持但不限于 Main 方法。Install/Upd…

美國用戶現在可以下載其所有Apple帳戶數據,這是操作方法

Starting today, Apple is allowing all US users to download a copy of every last bit of their data from the company. 從今天開始,Apple允許所有美國用戶從該公司下載其數據的最后一部分的副本。 This feature has been available for EU users since May, th…

java 的原碼、補碼、反碼小總結

先看一個代碼吧: int h; return (key null) ? 0 : (h key.hashCode()) ^ (h >>> 16); 這個應該很熟悉吧,是 java 里 HashMap 的計算 hash 值的方法.這里有一個運算符 "^",他其實就是使用補碼來運算的.好了,那么我們下面來說說這些…

Django08:模型層(ORM)--測試腳本/必知的13條/神器的雙下劃線查詢/多表操作

單表操作 django 自帶的sqlite3數據庫對日期格式不是很敏感,處理的時候容易出錯。 測試腳本 測試環境準備:去manage.py 中拷貝錢四行代碼,然后自己手寫兩行。 腳本無論在引用下面,還是單獨開設PY文件都可以。 import os impor…

“互聯網+”促傳統企業三大轉型

2015年是傳統行業互聯網化的元年。國家提出要制定“互聯網”行動計劃后,互聯網旅游、互聯網汽車、互聯網三農、互聯網物流、互聯網醫療等開始起步。同時,面對不確定的移動互聯網時代,互聯網某些技術和模式還在進化、演變之中,每一…

開發高性能ASP.NET應用

本文是“.NET Conf China 2022”上我的一個分享,這里更細化的分享出來。分享分為四個部分:制定指示設計應用正確測試性能優化高性能:不一定是架構出來的,但一定是優化出來的。制定指標-收集首先把項目中的熱路徑API和核心API找出來…

Ethereum-EIPs

What is an EIP? Ethereum Improvement Proposal 以太坊改進建議的文檔 這個文檔向Ethereum社區提供信息,為Ethereum、Ethereum的進程、環境描述一個新特征,該EIP應當為該特征提供一個基本的技術描述和原理原理。該EIP作者有責任在社區和不同意見的文檔…

Django08-1:模型層(ORM)--聚合查詢/分組查詢/F與Q查詢/開啟事務/常用字段及參數/自定義字段/數據庫查詢優化

聚合查詢 單獨使用時,用aggregate 1.只要是跟數據庫相關的模塊 基本都在django.db.models里面 如果沒有應該在django.db里面 2. 聚合查詢通常配合分組使用 from django.db.models import Avg, Sum, Max, Min, Count# 1.所有書的平均價格 resmodels.Book.objects.…

記事本狀態欄不會自動_如何在記事本中同時啟用狀態欄和自動換行

記事本狀態欄不會自動The status bar in Windows’ Notepad displays the current line number and column number of the cursor location. However, if you find that the Status Bar option on the View menu is grayed out, it may be because you have Word Wrap enabled…

洛谷P2587 [ZJOI2008] 泡泡堂

題目傳送門 分析:一道策略游戲題,要求最大期望得分和最小期望得分。首先分析最大,很顯然是可以用一種類似于田忌賽馬的思維來做,將兩隊的實力按照從大到小(其實從小到大也可以)排序,然后就按照順…

極端高溫導致澳大利亞斷網

西澳大利亞首府珀斯因惡劣天氣出現了網絡連接問題, 網絡故障不是由于暴風雨或閃電引起的,而是極端高溫。本周一是珀斯有記錄以來第六熱的天,當天最高溫度達到了44.4℃。因為創紀錄的高溫,澳大利亞寬帶 服務商iiNet在當…

推薦一款采用 .NET 編寫的 反編譯到源碼工具 Reko

今天給大家介紹的是一款名叫Reko的開源反編譯工具,該工具采用C#開發,廣大研究人員可利用Reko來對機器碼進行反編譯處理。我們知道.NET 7 有了NativeAOT 的支持,采用NativeAOT 編譯的.NET程序 無法通過ILSpy 之類的傳統工具得到源碼&#xff0…

并行傳輸數據和串行傳輸數據_為什么串行數據傳輸比并行數據傳輸快?

并行傳輸數據和串行傳輸數據SATA hard drive connections are faster than older PATA hard drive connections and the same can be said for external cabling standards, but this is counter-intuitive: why wouldn’t the parallel transmission be faster? SATA硬盤驅動…

得到某月的天數

Calendar timeCalendar.getInstance(); time.clear(); time.set(Calendar.YEAR,2018);//year年 time.set(Calendar.MONTH,1);//Calendar對象默認一月為0,month月 int daytime.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天數 System.out.pri…

Django09:圖書管理系統筆記/choices用法/ MTV與MVC模型/多對多三種創建方式

圖書管理系統筆記 redirect括號內可以直接寫url 也可以直接寫別名 但如果別名需要參數,必須使用reverse解析。 choices用法 使用場景:能列舉完全的數據 #使用方法:xxx_choice #1. get.xxx_display #2. 如果超出范圍,則顯示原…