Nginx優化

1、Nginx優化思路

一、優化目的

  標準狀況下,軟件默認的參數都是對安裝軟件的硬件標準(最低配置)來設置的,目前咱們服務器的硬件資源遠遠大於要求的標準,因此爲了讓服務器性能更加出衆,充分利用服務器的硬件資源,咱們通常須要優化APP的併發數來提高服務器的性能。
  總結來講:1.服務器大併發實現;2.提高用戶體驗;3.爲公司省錢。javascript

2、工做進程優化

一、優化方案

  Nginx是主進程+工做進程模型,也就是一個主進程會掛幾個工做進程。php

  • worker_processes 1; 該指令指定工做進程數量
    通常按照CPU的總核心數調整,優化思想是:保證一個進程跑在一個核上,將每一個核充分利用起來。若是CPU的壓力依然很小,能夠設置保證一個核兩個進程。
  • worker_cpu_affinity 0010 0100 1000; 該指令調整CPU的親和力
    要保證一個核心上一個進程,這須要設置CPU的親和力,這裏用二進制掩碼來計算數字是幾。
  • worker_connections 1024; 一個工做進程的併發數
    這裏設置是一個工做進程能夠處理多少個鏈接,也就是併發數設置。

二、方案驗證

(1)首先查看確認當前server核心數

$ cat /proc/cpuinfo | grep "flags" | wc -l
4

(2)併發優化,配置修改nginx.conf以下所示:

worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;   # 依次表明從1到4這四個核
events {
    worker_connections 10240;   # 這個值通常先設比較小,觀察進程消耗再決定是否增長併發數
}

(3)nginx服務檢查

# 查看進程及進程是否處於對應核心上
$ ps -eo psr,pid,args | grep "nginx"
  0  13977 nginx: master process /usr/local/nginx/sbin/nginx      # 父進程
  0  13978 nginx: worker process
  1  13979 nginx: worker process
  2  13980 nginx: worker process
  3  13981 nginx: worker process
  0  14284 grep --color=auto nginx

# 查看nginx鏈接數
$ netstat -antpl | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13977/nginx: master

# 查看nginx當前鏈接的人數
$ netstat -antpl | grep nginx | grep ESTABLISHED | wc -l
0

3、長鏈接

一、什麼是長鏈接,爲何要使用長鏈接?

  nginx這種web服務器軟件都是屬於TCP協議的軟件,TCP協議的特色就在於每次鏈接時要進行三次握手,握手成功後再通信數據,通信結束後四次揮手斷開鏈接。
  而http協議是一個無狀態協議, 每次進行通信都要三次握手四次揮手,那服務器就須要常常去維護握手和斷開。 服務器壓力過大、浪費的資源也過多。
  所以通常都須要開啓長鏈接,在第一個請求結束後,等一段時間,若是這個時間內,再有請求過來,則不斷開鏈接,直接將數據發送給客戶端。這樣就下降了握手和揮手的次數和頻率。css

二、長鏈接配置方法

# 關閉長鏈接:0表明關閉 
keepalive_timeout 0; 

# 開啓長鏈接
# keepalive_timeout 65;

# 一個長鏈接處理最大請求數(按期釋放內存,防止內存溢出)
# keepalive_requests 8192;

三、長鏈接狀態查看

(1)服務器上查看鏈接狀態

  關閉長鏈接時:html

# 瀏覽器訪問完馬上進入TIME_WAIT狀態(主動關閉)
$ netstat -antpl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1317/master         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14698/nginx: master 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1095/sshd           
tcp        0      0 192.168.31.42:80        192.168.31.28:64977     TIME_WAIT   -                   
tcp        0      0 192.168.31.42:80        192.168.31.28:64978     TIME_WAIT   -                   
tcp        0      0 192.168.31.42:80        192.168.31.28:64979     TIME_WAIT   -                   
tcp        0      0 192.168.31.42:22        192.168.31.28:64678     ESTABLISHED 14636/sshd: root@pt 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1317/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1095/sshd

# 一段時間後鏈接消息消失
$ netstat -antpl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1317/master         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14698/nginx: master 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1095/sshd           
tcp        0      0 192.168.31.42:22        192.168.31.28:64678     ESTABLISHED 14636/sshd: root@pt 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1317/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1095/sshd

  開啓長鏈接時:前端

# 因爲前面設置長鏈接超時時間是65秒,這段時間內一直保持在ESTABLISHED狀態:
$ netstat -antpl 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1317/master         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14828/nginx: master 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1095/sshd           
tcp        0      0 192.168.31.42:80        192.168.31.28:51700     ESTABLISHED 14829/nginx: worker 
tcp        0      0 192.168.31.42:22        192.168.31.28:50373     ESTABLISHED 14777/sshd: root@pt 
tcp        0      0 192.168.31.42:22        192.168.31.28:64678     ESTABLISHED 14636/sshd: root@pt 
tcp        0      0 192.168.31.42:80        192.168.31.28:51701     ESTABLISHED 14829/nginx: worker 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1317/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1095/sshd 

# 時間超時長鏈接斷開
$ netstat -antpl 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1317/master         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14828/nginx: master 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1095/sshd           
tcp        0      0 192.168.31.42:22        192.168.31.28:50373     ESTABLISHED 14777/sshd: root@pt 
tcp        0      0 192.168.31.42:22        192.168.31.28:64678     ESTABLISHED 14636/sshd: root@pt 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1317/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1095/sshd

(2)瀏覽器上查看鏈接狀態

  關閉長鏈接時:
關閉java

  開啓長鏈接時:
開啓nginx

4、壓縮優化(數據壓縮)

  gzip(GNU-ZIP)是一種壓縮技術。通過gzip壓縮後頁面大小能夠變爲原來的30%甚至更小,這樣,用戶瀏覽頁面的時候速度會塊得多。gzip的壓縮頁面須要瀏覽器和服務器雙方都支持,實際上就是服務器端壓縮,傳到瀏覽器後瀏覽器解壓並解析。瀏覽器那裏不須要咱們擔憂,由於目前的巨大多數瀏覽器都支持解析gzip過的頁面。
  Nginx的壓縮輸出有一組gzip壓縮指令來實現。相關指令位於http{….}兩個大括號之間。web

一、nginx配置gzip

gzip on;        # 啓動gzip壓縮功能
gzip_proxied any;    # nginx作前端代理時啓用該選項,表示不管後端服務器的headers返回什麼信息,都無條件啓用壓縮
gzip_min_length 1k;   # 小於1k的小文件不壓縮(小文件可能會越壓縮越大)
gzip_buffers 4 8k;     # 設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流,按照原始數據大小以8k爲單位申請4倍內存空間
gzip_comp_level 6;    # gzip壓縮級別,1壓縮比最小處理速度最快,9壓縮比最大處理最慢也最消耗CPU,通常設置爲3便可
gzip_types text/plain text/css application/x-javascript application/javascript application/xml;   # 什麼類型的頁面或文檔啓用壓縮
gzip_vary on;         # 開啓在http header中添加Vary:Accept-Encoding

二、字段詳解

  • gzip off(on);
    該指令用於開啓或關閉gzip模塊(on/off)
  • gzip_min_length 1k;
    啓用gzip壓縮的最小文件,小於設置值的文件將不會壓縮。頁面字節數從header頭得content-length中進行獲取。默認值是0,無論頁面多大都壓縮。建議設置成大於1k的字節數,小於1k可能會越壓越大。
  • gzip_comp_level 1;
    gzip 壓縮級別,1-9,數字越大壓縮的越好,也越佔用CPU時間。所以會有傳輸快慢和CPU消耗大小平衡的問題。
  • gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
    進行壓縮的文件類型。javascript有多種形式。其中的值能夠在 mime.types 文件中找到。
  • gzip_vary on;
    是否在http header中添加Vary: Accept-Encoding,建議開啓。給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,因此避免浪費不支持的也壓縮,因此根據客戶端的HTTP頭來判斷,是否須要壓縮
  • gzip_disable "MSIE [1-6].";
    禁用IE 6 gzip
  • gzip_buffers 32 4k;
    設置壓縮所須要的緩衝區大小;32 4k表明以4k爲單位,安裝原始數據大小以4k爲單位的32倍申請內存。
  • gzip_http_version 1.0;
    設置gzip壓縮針對的HTTP協議版本(1.0 / 1.1)

5、客戶端緩存優化

一、語法和配置方法

  語法:expires [time|epoch|max|off]
  默認值:expires off
  做用域:http,server,location後端

location ~* \.(js|css)?$ {
    expires 1h;
}

二、實現示例

server {
    listen       80;
    server_name  localhost;
    location / {
        root   html/web1;
        index  index.html index.htm;
    }
    # 客戶端緩存設置:png或gif文件在客戶端緩存一個小時
    location ~* \.(png|gif)$ {
        expires 1h;
    }

測試瀏覽器刷新以Chrome爲例:瀏覽器

  • ctrl+f5
    清空本地緩存從服務器拿數據
  • F5或者 點擊 瀏覽器的刷新圖標
    優先從本地找,而後去找服務器覈對信息是否一致。一致則返回304,從本地拿數據
  • 回車
    從本地緩存拿數據

6、思考

  公司網站平常PV 60萬,Nginx服務器該如何優化?

相關文章
相關標籤/搜索