Nginx優化詳解

nginx 優化

user www-data; 運行用戶javascript

worker_processes 4; 啓動進程,一般設置成和cpu的數量相等php

阻塞和非阻塞網絡模型;

同步阻塞模型,一請求一進(線)程,當進(線)程增長到必定程度後css

更多CPU時間浪費到切換一,性能急劇降低,因此負載率不高html

nginx基於時間的非阻塞多路複用(epoll或kquene)模型java

一個進程在短期內能夠相應大量的請求node

建議值 <=cpu核心數量,通常高於cpu數量有好處,也許還有進程切換開銷的負面影響linux

將work process綁定到特定的cpu上,避免進程在cpu間切換的開銷nginx

  • work_cpu_affinity 0001 0010 0100 1000
  • 8內核4進程時的設置方法 work_cpu_affinity 00000001 00000010 00000100 10000000

worker_rlimit_nofile 655350 每進程最大可打開文件描述符數量(Linux上文件描述符比較廣義,網絡端口、設備、磁盤文件都是)算法

文件描述符用完了,新的連接會被拒絕,產生502類錯誤。

linux最大可打開文件數可經過ulimit -n FILECNT或 /etc/security/limit.conf配置json

理論值 系統最大數量/進程數。但進程間工做量並非平均分配的,因此可設置的大一些

error_log /var/log/nginx/error.log; 全局錯誤日誌及PID文件

pid /var/run/nginx.pid;

  • 工做模式及鏈接數上限

  events {

​ worker_connections 200000; 併發響應能力的關鍵配置值

每一個進程容許的最大同時鏈接數,work_connectins * work_processes =maxConnection;

要注意maxconnections不等同於可相應的用戶數量

由於通常一個瀏覽器會同時開兩條連接,若是反向代理,nginx到後端連服務器的連接數也要佔用鏈接數

因此,作靜態服務器時,通常maxClient = work_connectins *   work_processes / 2

作反向代理服務器時 maxClient = work_connectins * work_processes / 4

這個值理論上越大越好,但最多可承受多少請求與配件和網絡相關,也可最大可打開文件,最大可用socket數量

​ 指明使用epoll 或 kquene(*BSD)

​ use epoll; epoll是多路複用IO(I/O Multiplexing)中的一種方式,可是僅用於linux2.6以上內核,能夠大大提升nginx的性能

  • 要達到超高負載下最好的網絡響應能力,還有必要優化與網絡相關的linux內核參數

    worker_connections 1024; 單個後臺worker process進程的最大併發連接數

    multi_accept on;

}

http區域

設定http服務器,利用它的反向代理功能提供負載均衡支持

​ http {

​ include /etc/nginx/mime.types; 設定mime類型,類型由mime.type文件定義

​ default_type application/octet-stream;

​ access_log /var/log/nginx/access.log; 設定日誌格式

​ error_log logs/error_log crit;

​ access_log logs/access_log main;

  • 關閉此項可減小IO開銷,但也沒法記錄訪問信息,不利用業務分析,通常運維狀況不建議使用
  • 只記錄更爲嚴重的錯誤日誌,可減小IO壓力

    endfile on; sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,必須設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,下降系統的uptime.

    cp_nopush on; 啓用內核複製模式,應用保持開啓達到最快的IO效率

    cp_nodelay on|off; on禁用Nagle算法

    • 簡單說,啓動如上兩項配置,會在數據包達到必定大小後在發送數據,這樣會較少網絡通訊次數,下降阻塞機率,但也會影響響應的及時性,比較適合於文件下載這類的大數據包通訊場景

keepalive_timeout 0; HTTP1.1支持持久鏈接alive

* 下降每一個連接的alive時間可在必定程度上提升可響應鏈接數量,因此通常可適當下降此值

keepalive_timeout 30s; 鏈接超時時間

gzip on; 開啓gzip壓縮,有效下降網絡流量

gzip_min_length 1000; 太短的內容壓縮效果不佳,壓縮過程還會浪費系統資源

gzip_comp_level 4; 可選值1~9研所級別越高壓縮效率越高,但對系統性能要求越高。

gzip_types text/plain text/css application/json application/x-javascript text/xml 壓縮內容類別

open_file_cache max=655350 inactive=20s; 靜態文件緩存

* 最大緩存數量
* 文件未使用存活期

open_file_cache_valid 30s; 驗證緩存有效期時間間隔

open_file_cache_min_uses 2; 有效期內文件最少使用次數

設定請求緩衝

​ client_header_buffer_size 1k;

​ large_client_header_buffers 4 4k;

​ include /etc/nginx/conf.d/*.conf;

​ include /etc/nginx/sites-enabled/*;

設定負載均衡的服務器列表
upstream mysvr { 

        server 192.168.8.1:3128 weight=5; 

        server 192.168.8.2:80  weight=1; 

        server 192.168.8.3:80  weight=6; 

    } 
weigth參數表示權值,權值越高被分配到的概率越大(本機上的Squid開啓3128端口)

location表達式

syntax:location [=|~|~*|^~|@] /uri/ {...}

分別兩種配置模式,普通字符串匹配,正則匹配

無開頭引導字符或以=開頭表示普通字符串匹配

以~或~*開頭表示正則匹配,~*表示不區分大小寫

多個location時匹配規則

整體是先普通後正則,只識別URI部分,例如請求爲/test/1/abc.do? arg=xxx

1.先查找是否有=開頭的精確匹配,及location =/test/1/abc.do {...}

2.再查找普通匹配,以最大前綴爲規則,以下有兩個location

location /test/ {...}

location /test/1 {...}

則匹配後一項

3.匹配到一個普通格式後,搜索並未結束,而是暫存當前結果,並繼續在搜索正則模式

4.在全部正則模式location中找到第一個匹配向後,以此屁配項爲最終結果,因此正則匹配項匹配規則受定義先後順序影響,但普通匹配不會

5.若是未找到正則匹配項,則以3中緩存的結果爲最終結果

6.若是一個匹配都沒有,返回404

location =/ {...} 與 location / {...}的差異

前一個是精確匹配,只響應/請求,全部/xxx類請求不會之前綴匹配形式匹配到它 ,然後一個正相反,全部請求必然都是以/開頭,因此沒有其餘匹配結果時必定會執行到它

location ^~ / {...} ^~意思是非正則,表示匹配到此模式後再也不繼續正則搜索,全部若是這樣配置,至關於關閉了正則匹配功能 ,由於一個請求在普通匹配規則下沒獲得其餘普通匹配時,最終匹配到這裏

默認請求

 location / { 
   root   /root;      #定義服務器的默認網站根目錄位置 
   index index.php index.html index.htm;   #定義首頁索引文件的名稱 
   fastcgi_pass  www.xx.com; 
   fastcgi_param  SCRIPT_FILENAME     $document_root/$fastcgi_script_name; 
   include /etc/nginx/fastcgi_params; 
   }
定義錯誤提示頁面
  error_page   500 502 503 504 /50x.html;  
   location = /50x.html { 
   root   /root; 
  }
靜態文件,nginx本身處理
  location ~ ^/(images|javascript|js|css|flash|media|static)/ { 
  root /var/www/virtual/htdocs; 
  #過時30天,靜態文件不怎麼更新,過時能夠設大一點,若是頻繁更新,則能夠設置得小一點。 
  expires 30d; 
  }
PHP 腳本請求所有轉發到 FastCGI處理. 使用FastCGI默認配置.
 location ~ \.php$ { 
   root  /root; 
   fastcgi_pass 127.0.0.1:9000; 
   fastcgi_index index.php;
   fastcgi_param  SCRIPT_FILENAME  /home/www/www$fastcgi_script_name; 
   include fastcgi_params; 
   }
設定查看Nginx狀態的地址
 location /NginxStatus { 
   stub_status            on; 
   access_log              on; 
   auth_basic              "NginxStatus"; 
   auth_basic_user_file  conf/htpasswd; 
  } 
 #禁止訪問 .htxxx 文件 
  location ~ /\.ht { 
   deny all; 
  } 
 } 
}

以上是一些基本的配置,使用Nginx最大的好處就是負載均衡

若是要使用負載均衡的話,能夠修改配置http節點以下:

設定http服務器,利用它的反向代理功能提供負載均衡支持

  http { 
   include       /etc/nginx/mime.types;     #設定mime類型,類型由mime.type文件定義 
   default_type  application/octet-stream;  #設定日誌格式 
   access_log    /var/log/nginx/access.log; 
      #省略
   #設定負載均衡的服務器列表 
  upstream mysvr { 
   #weigth參數表示權值,權值越高被分配到的概率越大 
   server 192.168.8.1x:3128 weight=5;#本機上的Squid開啓3128端口 
   server 192.168.8.2x:80  weight=1; 
   server 192.168.8.3x:80  weight=6; 
  upstream mysvr2 { 
   #weigth參數表示權值,權值越高被分配到的概率越大 
   server 192.168.8.x:80  weight=1; 
   server 192.168.8.x:80  weight=6; 
    }

第一個虛擬服務器

  server { 
   #偵聽192.168.8.x的80端口 
   listen       80; 
   server_name  192.168.8.x; 
    #對aspx後綴的進行負載均衡請求 
   location ~ .\*\.aspx$ { 
    root   /root;      #定義服務器的默認網站根目錄位置 
    index index.php index.html index.htm;   #定義首頁索引文件的名稱。
    proxy_pass  http://mysvr ;#請求轉向mysvr 定義的服務器列表

如下是一些反向代理的配置可刪除.

  proxy_redirect off; #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
  proxy_set_header Host $host; 
  proxy_set_header X-Real-IP $remote_addr; 
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  client_max_body_size 10m;    #容許客戶端請求的最大單文件字節數 
  client_body_buffer_size 128k;  #緩衝區代理緩衝用戶端請求的最大字節數, 
  proxy_connect_timeout 90;  #nginx跟後端服務器鏈接超時時間(代理鏈接超時) 
  proxy_send_timeout 90;        #後端服務器數據回傳時間(代理髮送超時) 
  proxy_read_timeout 90;         #鏈接成功後,後端服務器響應時間(代理接收超時) 
  proxy_buffer_size 4k;             #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小 
  proxy_buffers 4 32k;               #proxy_buffers緩衝區,網頁平均在32k如下的話,這樣設置 
  proxy_busy_buffers_size 64k;    #高負荷下緩衝大小(proxy_buffers\*2) 
  proxy_temp_file_write_size 64k;  #設定緩存文件夾大小,大於這個值,將從upstream服務器傳 
   } 
  } 
 }

Nginx平滑升級

下載Nginx地址:http://nginx.org/download/ngi...
nginx版本:1.8.0
nginx升級版本:1.12.1
nginx -v #查看當前Nginx版本
nginx -V #查看當前Nginx編譯參數

clipboard.png
在執行編譯時會報錯沒有--with-http_spdy_module選項(nginx 1.9.5 已經沒有了 --with-http_spdy_module ,取代的是 --with-http_v2_module),查看官方模塊地址:http://nginx.org/en/docs/

clipboard.png

開始部署

[root@localhost src]#tar xvf nginx-1.12.1.tar.gz
[root@localhost nginx-1.12.1]# cd nginx-1.12.1
[root@localhost nginx-1.12.1]# ./configure
--user=tdoa 
--group=tdoa 
--prefix=/usr/local/tdoa/nginx
--with-file-aio
--with-http_stub_status_module
--with-http_gzip_static_module
--with-pcre=/root/linux-2015/down/pcre-8.32
--with-pcre-jit
--with-http_v2_module
[root@localhost nginx-1.12.1]# make

執行make後,make install無需執行,將現有nginx重命名

[root@localhost objs]# mv /usr/local/tdoa/nginx/sbin/nginx  /usr/local/tdoa/nginx/sbin/nginx.old
[root@localhost objs]# pwd
/usr/local/src/nginx-1.12.1/objs
[root@localhost objs]# cp nginx
nginx    nginx.8  
[root@localhost objs]# cp nginx /usr/local/tdoa/nginx/sbin/
[root@localhost objs]# /usr/local/tdoa/nginx/sbin/nginx -v
nginx version: nginx/1.12.1
[root@localhost objs]# /usr/local/tdoa/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/tdoa/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/tdoa/nginx/conf/nginx.conf test is successful
[root@localhost objs]# /usr/local/tdoa/nginx/sbin/nginx -s reload
[root@localhost objs]# netstat  -tnlp |grep 80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      98457/nginx         
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1680/cupsd          
tcp        0      0 ::1:631                     :::*                        LISTEN      1680/cupsd
相關文章
相關標籤/搜索