nginx性能優化

提高併發連接

調整worker進程數

提高CPU的親和力,將CPU與進程綁定,減少進程間的切換,避免CPU資源使用不均

  1. worker_processes auto; #設置nginx的worker進程數,auto將自動設置爲與CPU核數相同
  2. worker_cpu_affinity 0001 0010 0100 1000; #將CPU與nginx進程綁定,0001、0010、0100、1000分別代表第1,2,3,4核CPU

修改文件句柄

修改用戶打開的最大句柄數

vim /etc/security/limits.conf 
* soft nofile 65535
* hard nofile 131072

修改nginx打開的最大句柄數

worker_rlimit_nofile 65535;

修改事件處理模型

  1. use epoll; #使用epoll事件處理模型
  2. worker_connections 1024; #單個worker進程允許的最大連接數
  3. multi_accept on; #告訴nginx收到一個新連接通知後接受儘可能多的連接,默認是on,設置爲on後,多個worker按串行方式來處理連接,也就是一個連接只有·一個worker被喚醒,其他的處於休眠狀態,設置爲off後,多個worker按並行方式來處理連接,也就是一個連接會喚醒所有的worker,直到連接分配完畢,沒有取得連接的繼續休眠。當你的服務器連接數不多時,啓用這個參數會讓負載有一定的降低,但是當服務器的吞吐量很大時,爲了效率,可以關閉這個參數。

開啓高效傳輸模式

  1. sendfile on; #sendfile是作用於兩個文件描述符之間的數據拷貝函數,開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。

    注意:如果圖片顯示不止常把這個改成off。

  2. tcp_nopush on;必須在sendfile開啓模式纔有效,防止網絡及磁盤I/O阻塞,積極的減少網絡報文段的數量(將響應頭和正文的開始部分·起發送,而不一個接個的發送。)

連接超時時間

主要目的是保護服務器資源,CPU,內存,控制連接數,因爲建立連接也是需要消耗資源的

keepalived_timeout 60;    #客戶端連接保持會話超時時間,超過這個時間,服務器斷開這個鏈接tcp_nodelay on;      #也是防止網絡阻塞,不過要包涵在keepalived參數纔有效
client header buffer size 4k; #客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求頭的大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裏設置爲分頁大小。分頁大小可以用命令getconf PAGESIZE取得。
open_file cache max=102400 inactive=20s;   #這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求後刪除緩存。
open_file_cache_valid 30s;      #這個是指多長時間檢查一次緩存的有效信息。
open_file_cache_min_uses 1;     #open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive時間內一次沒被使用,他將被移除
client_header_timeout  15;    #設置請求頭的超時時間。我們也可以把這個設置低些,如果超過這個時間沒有發送任何數據,nginx將返同request time out的錯誤
client_body_timeout 15;    #設置請求體的超時時間。我們也可以把這個設置低些,超過這個時間沒有發送任何數據,和上面一樣的錯誤提示
reset_timeout_connection on;    #告訴nginx關閉不響應的客戶端連接。這將會釋放那個客戶端所佔有的內存空間。
send_timeout  15;響應客戶端超時時間,這個超時時間僅限於兩個活動之間的時間,如果超過這個時間,客戶端沒有任何活動,nginx關閉連接
server_tokens off;    #並不會讓nginx執行的速度更快,但它可以關閉在錯誤頁面中的nginx版本數字,這樣對於安全性是有好處的。
client_max_body_size 10m;    #上傳文件大小限制

fastcgi調優

fastcgi_connect_timeout 600;   #指定連接到後端FastCGI的超時時間。
fastcgi_send_timeout 600;     #向FastCGI傳送請求的超時時間。
fastcgi_read_timeout 600;       #指定接收FastCGI應答的超時時間。
fastcgi_buffer_size 64k;         #指定讀取FastCGI應答第一部分需要用多大的緩衝區,默認的緩衝區大小爲fastcgi_buffers指令中的每塊大小,可以將這個值設置更小。
fastcgi_buffers 4 64k;           #指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求,如果一個php腳本所產生的頁面大小爲256KB,那麼會分配4個64KB的緩衝區來緩存,如果頁面大小大於256KB,那麼大於256KB的部分會緩存到fastcgi_temp_path指定的路徑中,但是這並不是好方法,因爲內存中的數據處理速度要快於磁盤。一般這個值應該爲站點中php腳本所產生的頁面大小的中間值,如果站點大部分腳本所產生的頁面大小爲256KB,那麼可以把這個值設置爲“8 32K”“4 64k”等。
fastcgi_busy_buffers_size 128k;  #建議設置爲fastcgi_buffers的兩倍,繁忙時候的buffer
fastcgi_temp_file write_size 128k;       #在寫入fastcgi_temp_path時將用多大的數據塊,默認值是fastcgi_buffers的兩倍,該數值設置小時若負載上來時可能報502BadGateway
fastcgi_temp_path /usr/local/nginx/nginx_tmp;      #緩存臨時目錄
fastcgi_intercept_errors on;         #這個指令指定是否傳遞4xx和5xx錯誤信息到客戶端,或者允許nginx使用error_page處理錯誤信息。
注:靜態文件不存在會返回404頁面,但是php頁面則返回空白頁!!
fastcgi cache_path/usr/local/nginx1.10/fastcgi cachelevels=1:2 keys_zone=cache_fastcgi:128 minactive=1d max_size=10g;     #fastcgi_cache緩存日錄,可以設置目錄層級,比如1:2會生成16*256個子目錄,cache_fastcgi是這個緩存空間的名字,c ache是用多少內存(這樣熱門的內容nginx直接放內存,提高訪問速度),inactive表示默認失效時間,如果緩存數據在失效時間內沒有被訪問,將被刪除,max_size表示最多用多少硬盤空間。
fastcgi_cache cache_fastcgi;       #表示開啓FastCGI緩存併爲其指定一個名稱。開啓緩存非常有用,可以有效降低CPU的負載,並且防止502的錯誤放生。cache_fastcgi爲proxy_cache_path指令創建的緩存區名稱
fastcgi_cache_valid 200 302 1h;       #用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一小時,要和fastcgi_cache配合使用
fastcgi_cache_valid 301 1d;              #將301應答緩存一天
fastcgi_cache_valid any 1m;         #將其他應答緩存爲1分鐘
fastcgi_cache_min_uses 1;          #該指令用於設置經過多少次請求的相同URL將被緩存。
fastcgi_cache key http://$host$request_uri;       #該指令用來設置web緩存的Key值,nginx根據key值md5哈希存儲.一般根據host(域名)、$request_uri(請求的路徑)等變量組合成proxy_cache_key。
fastcgi_pass;         #指定FastCGI服務器監聽端口與地址,可以是本機或者其它

gzip調優

使用gzip壓縮功能,可能爲我們節約帶寬,加快傳輸速度,有更好的體驗,也爲我們節約成本,所以說這是一個重點。
Nginx啓用壓縮功能需要你來ngx_http_gzip_module模塊,apache使用的是mod_deflate,一般我們需要壓縮的內容有:文本,js,html,css,對於圖片,視頻,flash什麼的不壓縮,同時也要注意,我們使用gzip的功能是需要消耗CPU的

gzip_vary.on;
gzip_proxied any;
gzip on;#開啓壓縮功能
gzip_min_length 2k;   #設置允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-
Length中獲取,默認值是0,不管頁面多大都進行壓縮,建議設置成大於1K,如果小於1K可能會越壓越大。
gzip_buffers 432k;#壓縮緩衝區大小,表示中請4個單位爲32K的內存作爲壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。
gzip_http_version 1.1;#壓縮版本,用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP解壓,使用默認即可gzip_comp_level 6;#壓縮比例,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,但是處理慢,也比較消耗CPU資源。
gzip types text/css text/xml application/javascript;  #用來指定壓縮的類型,'text/htm1'類型總是會被壓縮。
默認值:gzip_types text/html(默認不對js/css文件進行壓縮)
#壓縮類型,匹配MIME圖型進行壓縮
#不能用通配符text/*
#(無論是否指定)text/html默認已經壓縮
#設置哪壓縮種文本文件可參考conf/mime.types
gzip_vary on;  #varyheader支持,該選項可以讓前端的緩存服務器緩存經過GZIP壓縮的頁面,例如用Squid緩存經過nginx壓縮的數據

expires緩存調優

緩存,主要針對於圖片,css,js等元素更改機會比較少的情況下使用,特別是圖片,佔用帶寬大,我們完全可以設置圖片在瀏覽器本地緩存365d,css,js,html可以緩存個10來天,這樣用戶第一次打開加載慢一點,第二次,就非常快了!緩存的時候,我們需要將需要緩存的拓展名列出來,Expires緩存配置在server字段裏面

location ~* \.(ico|jpg|gif|png|bmp|swf|flv)$ {
    expires 30d;
    # log_not_found off; 
    access_log off;
}
location ~* \.(js|css)$ {
    expires 7d;
    log_not_found off; 
    access_log off;
}

注:1og_not_found off;是否在error_log中記錄不存在的錯誤。默認是。

總結:

expire功能優點:

  1. expires可以降低網站購買的帶寬,節約成本
  2. 同時提升用戶訪問體驗
  3. 減輕服務的壓力,節約服務器成本,是web服務非常重要的功能。

expire功能缺點:

被緩存的頁面或數據更新了,用戶看到的可能還是舊的內容,反而影響用戶體驗。解決辦法:第一個縮短緩存時間,例如:1天,但不徹底,除非更新頻率大於1天;第二個對緩存的對象改名。

網站不希望被緩存的內容:

1)網站流量統計工具
2)更新頻繁的文件(google的logo)

內核優化

  1. fs.file-max =999999:這個參數表示進程(比如一個worker進程)可以同時打開的最大句柄數,這個參數直線限制最大併發連接數,需根據實際情況配置。
  2. net.ipv4.tcp_max_tw_buckets=6000#這個參數表示操作系統允許TIME_WAIT套接字數量的最大值,如果超過這個數字,TIME_WAIT套接將立刻被清除並打印警告信息。該參數默認爲180000,過多的TIME_WAIT套接字會使Web服務器變慢。

    注:主動關閉連接的服務端會產生TIME_WAIT狀態的連接

  3. net.ipv4.ip_local_port_range=1024 65000 #允許系統打開的端口範圍。
  4. net.ipv4.tcp_tw_recycle=1 #啓用timewait快速回收。
  5. net.ipv4.tcp_tw_reuse=1 #開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接。
  6. 這對於服務器來說很有意義,因爲服務器上總會有大量TIME-WAIT狀態的連接。
  7. net.ipv4.tcp keepalive_time=30 #這個參數表示當keepalive啓用時,TCP發送keepalive消息的頻度。默認是2小時,若將其設置的小一些,可以更快地清理無效的連接。
  8. net.ipv4.tcp_syncookies =1 #開啓SYN Cookies,當出現SYN等待隊列溢出時,啓用cookies來處理。
  9. net.core.somaxconn=40960 #web應用中listen函數的backlog默認會給我們內核參數的 net.core.somaxconnwwwaqniuktcom wanger限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認爲511,所以有必要調整這個值。
  10. 注:對於一個TCP連接,Server與client需要通過三次握手來建立網絡連接。當三次握手成功後,我們可以看到端口的狀態由LISTEN轉變爲ESTABLISHED,接着這條鏈路上就可以開始傳送數據了,每一個處於監聽(Listen)狀態的端口,都有自己的監聽隊列,監聽隊列的長度與如somaxconn參數和使用該端口的程序中listen()函數有關
  11. somaxconn參數:定義了系統中每一個端口最大的監聽隊列的長度,這是個全局的參數,默認值爲128,對於一個經常處理新連接的高負載web服務環境來說,默認的128太小了。大多數環境這個值建議增加到1024或者更多。大的偵聽隊列對防止拒絕服務DoS***也會有所幫助。
  12. net.core.netdev_max backlog=262144 #每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
  13. net.ipv4.tcp_max_syn_backlog=262144 #這個參數標示TCP三次握手建立階段接受SYN請求隊列的最大長度,默認爲1024,將其設置得大一些可以使出現Nginx繁忙來不及accept新連接的情況時,Linux不至於丟失客戶端發起的連接請求。
  14. net.ipv4.tcp_rmem=10240 87380 12582912 #這個參數定義了TCP接受緩存(用於TCP接受滑動窗口)的最小值、默認值、最大值。
  15. net.ipv4.tcp_wmem=10240 87380 12582912 #這個參數定義了TCP發送緩存(用於TCP發送滑動窗口)的最小值、默認值、最大值。
  16. net.core.rmem_default=6291456 #這個參數表示內核套接字接受緩存區默認的大小。
  17. net.core.wmem_default=6291456 #這個參數表示內核套接字發送緩存區默認的大小。
  18. net.core.rmem_max=12582912 #這個參數表示內核套接字接受緩存區的最大大小。
  19. net.core.wmem_max=12582912 #這個參數表示內核套接字發送緩存區的最大大小。
  20. net.ipv4.tcp_syncookies=1 #該參數與性能無關,用於解決TCP的SYN***。

歡迎關注個人公衆號“沒有故事的陳師傅”
nginx性能優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章