Nginx優化之服務性能優化


優化Nginx服務的worker進程個數

修改nginx主配置文件

worker_processes 1;  #指定了Nginx要開啟的進程數,結尾數字就是進程個數

Nginx有Master進程和worker進程之分,Master為管理進程,真正接待“顧客”的是worker進程。

優化Nginx進程個數的策略

(1)worker_processes參數大小的設置最好和網站的用戶數量相關聯,

(2)新搭建服務器時,worker進程數最開始的設置可以等於CPU的核數,高流量高並發場合也可以考慮將進程數提高至CPU核數*2

查看Web服務器CPU硬件資源信息

通過/proc/cpuinfo可查看CPU個數及總核數。查看CPU總核數的示例如下:

grep processor /proc/cpuinfo 
processor   : 0
processor   : 1
processor   : 2
processor   : 3

grep processor /proc/cpuinfo | wc -l
4               #表示為1顆CPU四核
#查看CPU總顆數示例如下:
grep "physical id" /proc/cpuinfo 
physical id : 0 #物理ID一致,同一顆CPU
physical id : 0 #物理ID一致,同一顆CPU
physical id : 0 #物理ID一致,同一顆CPU
physical id : 0     #物理ID一致,同一顆CPU
grep "physical id" /proc/cpuinfo | sort | uniq | wc -l
1               #去重復,表示1顆CPU

修改重啟后的worker進程數量,如下:

ps -ef | grep "nginx" | grep -v grep
root       1110      1  0 11:12 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      1429   1110  0 11:33 ?        00:00:00 nginx: worker process      
nginx      1430   1110  0 11:33 ?        00:00:00 nginx: worker process      
nginx      1431   1110  0 11:33 ?        00:00:00 nginx: worker process      
nginx      1432   1110  0 11:33 ?        00:00:00 nginx: worker process     

從“worker_processes 4”可知,worker進程數為4個。Nginx Master主進程不包含在這個參數內,Nginx Master的主進程為管理進程,負責調度和管理worker進程。

Nginx事件處理模型優化

在Linux下,Nginx使用epoll的I/O多路復用模型,在Freebsd中使用kqueue的I/O多路復用模型,在Solaris中使用/dev/poll方式的I/O多路復用模型,在Windows中使用的是icop,等等。

也可以不指定事件處理模型,Nginx會自動選擇最佳的事件處理模型服務。 

#具體的配置參數如下:
events      #events指令是設定Nginx的工作模式及連接數上限
{
    use epoll;     #use是一個事件模塊指令,用來指定Nginx的工作模式。Nginx支持的工作模式有select,poll,kqueue,epoll,rtsig和/dev/poll。
  其中select和poll都是標准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系統中。
  對於Linux系統Linux2.6+內核,推薦選擇epoll工作模式,這是高性能高並發的設置 }

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

調整Nginx單個進程允許的客戶端最大連接數,控制參數為work_connections。 (worker_connections的值要根據具體服務器性能和程序的內存使用量來指定)

events  #events指令是設定Nginx的工作模式和連接數上線
{
    worker_connections 20480;
    #worker_connections也是個事件模塊指令,用於定義Nginx每個進程的最大連接數,默認是1024.最大客戶端連接數由worker_processes和worker_connections決定,
  即Max_client
= worker_processes*worker_connections。進程的最大連接數受Linux系統進程的最大打開文件數限制,在執行操作系統命令
  “ulimit -HSn 65535”或配置相應文件后,worker_connections的設置才能生效。 }

實際的並發連接數除了受worker_connections參數控制外,還和最大打開文件數worker_rlimit_nofile有關,Nginx總並發連接=worker數量*worker_connections。 

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

worker_rlimit_nofile 65535;
#最大打開文件數,可設置為系統優化后的ulimit -HSn的結果

放置位置:主標簽段  此參數的作用是改變worker processes能打開的最大文件數 

開啟高效文件傳輸模式

http模塊

設置參數1:sendfile on;   #激活或禁用sendfile()功能功能。 

#sendfile參數用於開啟文件的高效傳輸模式。同時將tcp_nopush和tcp_nodelay兩個指令設置為on,可防止網絡及磁盤I/O阻塞,提升Nginx工作效率。

 設置參數2:tcp_nopush on;  #激活或禁用Linux上的TCP_CORK socket選項,此選項僅僅當開啟sendfile時才生效,允許把http response header和文件的開始部分放在一個文件里發布,作用是減少網絡報文段的數量。

優化Nginx連接參數,調整連接超時時間

連接超時的作用

(1)將無用的連接設置為盡快超時,可以保護服務器的系統資源

(2)當連接很多時,及時斷掉那些已經建立好的但又長時間不做事的連接,以減少其占用的服務器資源

(3)黑客攻擊網站,就會不斷地和服務器建立多個連接,消耗連接數,大量消耗服務器的資源.

(4)LNMP環境中,如果用戶請求了動態服務,則Nginx就會建立連接,請求FastCGI服務以及后端MySQL服務,,后端的FastCGI服務及MySQL服務也有對連接的超時控制。

不同程序連接設定知識

服務器建立新連接也是要消耗資源的,因此,超時設置得太短而並發很大,就會導致服務器瞬間無法響應用戶的請求,導致用戶體驗下降。

PHP程序站點設置成短連接,PHP程序建立連接消耗的資源和時間相對要少些。對於Java程序站點來說,一般建議設置長連接,因為Java程序建立連接消耗的資源和時間更多.

Nginx連接超時的參數設置

在http模塊

設置參數(1):keepalive_timeout 60;      #保持會話的超時時間為60秒

設置參數(2):tcp_nodelay on;        #用於激活tcp_ondelay功能,提高I/O性能。

  默認情況下當數據發送時,內核並不會馬上發送,可能會等待更多的字節組成一個數據包,這樣可以提高I/O性能。使用tcp_nodelay功能,等待時間會比較長。

設置參數(3):client_header_timeout 15;      #設置讀取客戶端請求頭數據的超時時間

  設置讀取客戶端請求頭數據的超時時間。服務器端將返回“Request time out (408)”錯誤,可指定一個超時時間,防止客戶端利用http協議進行攻擊。

設置參數(4):client_body_timeout 15;      #用於設置讀取客戶端請求主體的超時時間,默認值60

設置參數(5):send_timeout 25;         #用於指定響應客戶端的超時時間。

上傳文件大小的限制

調整上傳文件的大小

在Nginx主配置文件里加入如下參數:

client_max_body_size 8m;            #具體大小根據公司的業務做調整,如果不清楚就先設置為8m.

設置最大的允許的客戶端請求主體大小,在請求頭域有“Content-Length”,如果超過了此配置值,客戶端會受到413錯誤,設置為0表示禁止檢查客戶端請求主體大小。

 FastCGI相關參數調優

Nginx FastCGI客戶端向后請求PHP動態引擎服務(php-fpm(FastCGI服務器端)

 fastcgi_connect_timeout ;      #表示Nginx服務器和后端FastCGl服務器連接的超時時間,默認值為60fastcgi_ connect. timeout 秒,這個參數值通常不要超過75秒,因為建立的連接越多,消耗的資源就越多

fastcgi_send_timeout ;        #設置Nginx允許FastCG1服務器端返回數據的超時時間,即在規定時間之fastcgi_ send. timeout 內后端服務器必須傳完所有的數據,否則,Nginx將斷開這個連接。其默認值為60秒

 fastcgi_read_timeout ;       #設置Nginx從FastCGl服務器端讀取響應信息的超時時間,表示連接建立fastcgi_ read_ timeout 成功后,Nginx等待后嶺服務器的響應時間,是Nginx已經進人后端的排隊之中等候處理的時間

 fastcgi_buffer_size 64k;      #這是Nginx FastCGl的緩沖區大小參數,設定用來讀取以FastCGl服務器端收到的第-一部分響應信息的緩沖區大小,這里的第-部分通常會包含-一個fastcgi_ buffer. size小的響應頭部。默認情況下,這個參數的大小是由fastegi buffers 指定的一個緩沖區的大小

 fastcgi_buffers 4 64k;        #設定用來讀取從FastCGl服務器端收到的響應信息的緩沖區大小和緩沖區數量,默認值為fastcgi buffers 8 4k{8k;。指定本地需要用多少和多大的緩沖區來緩沖FastCGl的應答請求。如果一個PHP腳本所產生的頁面大小為256KB,那么會為其分配4個64KB的緩fastcgi_ buffers 沖區來緩存;如果頁面大小大於256KB.那么大於256KB的部分會緩存到fastcgi temp 指定的路徑中,但是這並不是好方法,因為內存中的數據處理速度要快於硬盤。一般這個值應該為站點中PHP腳本所產生的頁面大小的中間值,如果站點大部分腳本所產生的頁面大小為256KB,那么可以把這個值設置為“1616k”, "464k”等

proxy_busy_buffers_size ;      #用於設置系統很忙時可以使用的proxy_ buffers大小,官方推薦的大小為proxy_ buffers*2

fastcgi_busy_buffers_size ;      #用於設置系統很忙時可以使用的fastcgibuffers大小,官方推薦的大小為fastcgi_ buffers*2

fastcgi_temp_file_write_size ;     #FastCGI臨時文件的大小,可設為128~256KB

fastcgi_cache_valid ;      #示例: fastcgi cache_ valid 200 302 1h;用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一個小時。示例: fastcgi_ cache_ valid 301 ld;將301應答緩存1天。示例: fastcgi_ cache_ valid any 1m,將其他應答緩存設置為1分鍾

 fastcgi_ cache_ min_ uses;    #示例: fastcgi_ cache_ min_ uses 1;設置請求幾次之后響應將被緩存,1表示一次即被緩存

fastcgi_ cache_ use_ stale;     # 示例: fastcgi_ cache_ use_ stale error timeout invalid_ header http_ 500;定義在哪些情況下使用過期緩存

fastcgi_ cache_ key;     #示例: fastcgi_ cache_ key $request_ method://$host$request_ uri;fastcgi_ cache_ key http://$host$request uri;定義fastcgi cache的key,示例中以請求的URI作為緩存的key, Nginxfastcgi_ cache_ key 會取這個key的md5作為緩存文件,如果設置了緩存散列目錄,Nginx會從后往前取相應的位數做為目錄。注意一定要加上$request_ method 作為cache key, 否則如果先請求的為head類型,后面的GET請求返回為空

 

Nginx gzip壓縮實現性能優化

Nginx gzip壓縮功能介紹

Nginx gzip壓縮模塊提供了壓縮文件內容的功能,Nginx服務器會根據一些具體的策略實施壓縮,以節約網站出口帶寬,同時加快數據傳輸效率,來提升用戶訪問體驗。

Nginx gzip壓縮的優點

(1)提升網站用戶體驗;發送給用戶的內容小了,用戶訪問單位大小的頁面就加快了,用戶體驗提升了

 

(2)節約網站帶寬成本:數據是壓縮傳輸的,因此節省了網站的帶寬流量成本,不過壓縮時會稍微消耗一些CPU資源,這個一般可以忽略。

#此功能既能提升用戶體驗,又能使公司少花錢,一舉多得。對於幾乎所有的Web服務來說,這是一個非常重要的功能,Apache服務也有此功能。

需要和不需要壓縮的對象

純文本內容壓縮比很高,純文本的內容最好進行壓縮,例如:html,js,css,xml,shtml等格式的文件。

被壓縮的純文本文件必須要大於1KB.

圖片,視頻(流媒體)等文件盡量不要壓縮,因為這些文件大多都是經過壓縮的.

參數介紹及配置說明

Nginx的gzip壓縮功能依賴於ngx_http_gzip_module模塊,默認已安裝。

對應的壓縮參數說明如下:

#######壓縮的配置介紹######
gzip on;    #開啟gzip壓縮功能
gzip_min_length 1k;      #設置允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取。默認值0,表示不管頁面多大都進行壓縮。 建議設置成大於1K,如果小於1K可能會越壓越大。
gzip_buffers 4 16K;    #壓縮緩沖區大小。表示申請4個單位為16K的內存作為壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。
gzip_http_version 1.1;      #壓縮版本(默認1.1,前端為squid2.5時使用1.0),用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP解壓, 使用默認即可。
gzip_comp_level 2;      #壓縮比率。用來指定gzip壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理最慢,也比較消耗CPU資源。
gzip_types text/plain application/x-javascript text/css application/xml;
      #用來指定壓縮的類型,“text/html”類型總是會被壓縮,這個就是HTTP原理部分講的媒體類型。
gzip_vary on;        #vary header支持。該選項可以讓前端的緩存服務器緩存經過gzip壓縮的頁面,例如用Squid緩存經過Nginx壓縮的數據。

配置Nginx expires緩存實現性能優化

 Nginx expires功能介紹

簡單說,Nginx expires的功能就是為用戶訪問的網站內容設定一個過期時間,當用戶第一次訪問這些內容時,會把這些內容存儲在用戶瀏覽器本地,這樣用戶第二次及以后繼續訪問該網站時,瀏覽器會檢查加載已經緩存在用戶瀏覽器本地的內容,就不會去服務器下載了,直到緩存的內容過期或被清除為止。

 Nginx expires功能優點

  1. expires可以降低網站的帶寬,節約成本。
  2. 加快用戶訪問網站的速度,提升用戶訪問體驗。
  3. 服務器訪問量降低了,服務器壓力就減輕了,服務器成本也會降低,甚至可以節約人力成本。
  4. 對於幾乎所有的Web服務來說,這是非常重要的功能之一,Apache服務也有此功能。

 Nginx expires配置詳解

根據文件擴展名進行判斷,添加expires功能范例:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
    expires 3650d;        #緩存時間3650天
}

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

 {

  expires 30d;

}

}

根據URL中的路徑(目錄)進行判斷,添加expires功能范例:

location ~ ^/(images|javascript|js|css|flash|media|static)/
{
    expires 360d;
}

當網站被緩存的頁面或數據更新了,此時用戶端看到的可能還是舊的已經緩存的內容,這樣就會影響用戶體驗,那么如何解決這個問題呢?

對於經常需要變動的圖片等文件,可以縮短對象緩存時間

當網站改版或更新時,可以在服務器將緩存的對象改名

企業網站緩存日期曾經的案例參考

  • 新浪:15天
  • 京東:25年
  • 淘寶:10年

企業網站有可能不希望被緩存的內容

  • 廣告圖片,用於廣告服務,都緩存了就不好控制展示了。
  • 網站流量統計工具(JS代碼),都緩存了流量統計就不准了。
  • 更新很頻繁的文件(google的logo),這個如果按天,緩存效果還是顯著的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM