web性能優化——代理(nginx)

簡介

一個很好的原則是調優時每次只個性一個配置。若是對配置的個性不能提升性能的話,改回默認值
優化必需要經過性能測試。不能意淫,須要先後對比,真實說明問題。javascript

場景

  1. 優化nginx。
  2. 確保每次請求控制必定資源。
  3. 減小訪問web容器

解決方案

nginx優化

全局優化

# nginx進程數,建議按照cpu數目來指定,通常爲它的倍數。
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
# 這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,可是nginx分配請求並非那麼均勻,因此最好與ulimit -n的值保持一致
worker_rlimit_nofile 65535;
events {
    # 使用epoll的I/O模型。
    use epoll;
    # 每一個進程容許的最多鏈接數,理論上每臺nginx服務器的最大鏈接數爲worker_processes*worker_connections
    worker_connections  50000;
}

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

#鏈接超時時間,單位時間是秒
keepalive_timeout  180;

#FastCGI相關參數是爲了改善網站的性能:減小資源佔用,提升訪問速度。下面參數看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

#防止網絡阻塞
tcp_nopush      on; 
tcp_nodelay        on; 
#開啓gzip壓縮
gzip  on; 
gzip_min_length 512;
gzip_buffers 4 16k;
gzip_http_version 1.0;   #壓縮版本(默認1.1,前端若是是squid2.5請使用1.0)
gzip_comp_level 5;
#壓縮類型,默認就已經包含text/html,因此下面就不用再寫了,寫上去也不會有問題,可是會有一個warn。
gzip_types text/plain application/json application/x-javascript text/css application/xml;
gzip_vary on; 
gzip_disable "MSIE [1-6]\.";



# 這個是指多長時間檢查一次緩存的有效信息。
open_file_cache_valid 30s;
# open_file_cache指令中的inactive參數時間內文件的最少使用次數,若是超過這個數字,文件描述符一直是在緩存中打開的,如上例,若是有一個文件在inactive時間內一次沒被使用,它將被移除。
open_file_cache_min_uses 1;
# 客戶端請求頭部的緩衝區大小,這個能夠根據你的系統分頁大小來設置,通常一個請求的頭部大小不會超過1k,不過因爲通常系統分頁都要大於1k,因此這裏設置爲分頁大小。分頁大小能夠用命令getconf PAGESIZE取得
open_file_cache max=102400 inactive=20s;

日誌

日誌是要讀寫文件的,I/O消耗特別嚴重。日誌是否開啓能夠根據本身具體的架構需求。
建議的是以下:css

  1. 靜態資源不記錄。html

    # 靜態資源經過nginx來管理
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ {
    # 關閉日誌
    access_log off;
    include deny/agent.conf;
    if (-f $request_filename) {
        expires 1d;
        break;
    }
    }
  2. 動態資源要記,可是須要添加緩存。前端

    access_log  logs/access.log  main buffer=2k;

限制資源使用

這個其實和安全很是類似。本質是限制資源使用,這樣就能讓有限的資源爲更多人提供服務。
因此能夠參見:web安全——代理(nginx)java

減小訪問web容器

通常web容器的性能都是比較差了,因此儘可能阻止訪問web容器。node

動靜分離

通常的web容器的長連接性能都比較弱,而nginx在這方面又特別優秀。nginx

# 動態的服務
server {
        server_name  sso.xxx.com;
        #監聽
        listen       80; 
        location / { 
            #反向代理到指定的服務
            proxy_pass http://xxx-server;
            #定義服務器的默認網站根目錄位置
            root    /; 
            proxy_set_header Host $host;
            #後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size  100m;
        }
}
# 靜態的服務
server {
        server_name  static.xxx.com;
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ {
        # 文件根目錄,這個目錄根據文件的位置變動便可。
        root /home/static;
        if (-f $request_filename) {
           expires 1d;
           break;
        }
}
}

緩存化

把一些熱點的數據放在緩存服務器,這樣能提高性能。
srcache_nginx+redis構建緩存系統。在web應用中經過設置http的緩存特性(最好是基於註釋或者配置,對開發者儘可能是透明的,不要增長業務複雜度),來判斷是否須要緩存。web

#設置key,根據域名和uri
set $key $host$request_uri;
#來一個md5,要否則key太長。並且key特別長的時候,貌似在srache_store的時候執行不了
set_md5 $md5key $key;
#調用HttpSRCacheModule的srcache_fetch 在http進入時,執行該方法,若是取到值,則不執行代理(即不執行tomcat),直接返回
srcache_fetch GET /redis2_get $md5key;
#若是沒有設置緩存時間,則默認時間爲這個
srcache_default_expire 3600s;
#調用HttpSRCacheModule的srcache_store在執行代理(即執行tomcat)後,執行該方法,並且必需爲「cache-control」 不等於"no-cahce"才執行。
#srcache_expire的取值優先級
#一、若是有cache-control;max-age=N,則取N
#二、若是沒有,有expire,則取expire
#三、若是都沒有取srcache_default_expire
srcache_store PUT /redis2_set key=$md5key&expire=$srcache_expire;

靜態化

把基本沒有變化的請求轉爲靜態文件資源。直接經過文件提供服務。
實現思路見下面的參考資料。
不過可能會有個問題,須要注意而且之後去解決redis

# 問題
日常訪問是沒有問題,但在高併發下,你想死的心都有。打開文件不對,一看是前面還沒寫完,另一個用戶就訪問了,又寫,致使文件格式不對。
# 建議思路
若是最終仍是要寫html,仍是經過程序去實現。例如:新聞類更新時,由編輯人員點擊發布,此時可能就寫了一個靜態的html,而不是由用戶去訪問出發寫html,避免高併發會出現的問題

須要進一步思考的地方:
緩存化靜態化使用的場景。以及在nginx使用靜態化是否合適。json

驗證方法

  1. pagespeed.webkaka.com。驗證是否開啓gzip。
  2. ab|webbench,來測試接口。

參考資料

  1. srcache_nginx+redis構建緩存系統
  2. nginx - 性能優化,突破十萬併發
  3. 經過Nginx架設靈活的網站靜態化方案
相關文章
相關標籤/搜索