1. 程式人生 > >Nginx 之生產環境應用

Nginx 之生產環境應用

通過nginx快取記憶體來演示

案例分析

某電商平臺商品詳情頁需要實現 700+ QPS(query操作,TPS提交操作),如何著手去做? 1. 首先為分析一下一個商品詳情頁有哪些資訊

從中得出 商品詳情頁依懶了

對於商品詳情頁涉及瞭如下主要服務:

這麼多資料不可能一起一下子就載入,不然會非常的卡,那麼該怎麼辦呢?? 

  • 商品詳情頁HTML頁面渲染
  • 價格服務 促銷服務
  • 庫存狀態/配送至服務
  • 廣告詞服務
  • 預售/秒殺服務
  • 評價服務
  • 試用服務
  • 推薦服務
  • 商品介紹服務
  • 各品類相關的一些特殊服務 

解決方案核心:

1. 採用Ajax 動態載入 價格、廣告、庫存等服務

2. 採用key value 快取詳情頁主體html。

方案架構:

請求不大時,我們一般把資料快取在redis中,這樣可以不用再去服務拿去資料,響應速度更快了, 但是當請求更多時,會出現瓶頸

問題:

當達到500QPS 的時候很難繼續壓測上去。

分析原因:

一個詳情頁html  主體達平均150 kb  那麼在500QPS 已接近區域網寬頻極限。必須減少內網通 信。  比如,一個詳情頁面150kb,500QPS*150/1024=73M,一秒就發生73多M的網路傳輸,這已經非常接近寬頻峰值128M

所以,我們可以把快取放在通過nginx放在本地上

基於Nginx 靜態快取的解決方案:

 如圖:我們通過ngnx配置把資料快取在本地,這樣使用者的訪問請求就不用經過商品詳情頁服務返回資料,除非當運維人員修改商品資訊時要清除快取,這時可以通過第三方來清除nginx配置的快取,這樣使用者就可看到最新資料

該方案nginx配置實現

一、在http元素下新增快取區宣告。 

proxy_cache_path  /data/nginx/cache_item  levels=1:1:2 keys_zone=cache_item:500m inactive=30d max_size=10g;

二、為指定location 設定快取策略

proxy_cache cache_item;
proxy_cache_key $host$uri$is_args$args;#以全路徑md5值做做為Key 
proxy_cache_valid 200 304 12h; #對不同的HTTP狀態碼設定不同的快取時間 
expires 7d; #總體快取時間 

快取引數詳細說明 

父元素 名稱 描述
http proxy_cache_path 指定快取區的根路徑
levels 快取目錄層級最高三層,每層1~2 個字元表示。如1:1:2 表示三層。
keys_zone 快取塊名稱 及記憶體塊大小。如 cache_item:500m 。表示宣告一 個名為cache_item 大小為 500m。超出大小後最早的資料將 會被清除。
inactive 最長閒置時間 如:10d 如果一個數 據被閒置10天將會被清除
max_size 快取區硬碟最大值。超出閒置資料 將會被清除
location proxy_cache 指定快取區,對應keys_zone 中 設定的值
proxy_cache_key 通過引數拼裝快取key 如: $host$uri$is_args$args 則會以 全路徑md5值做做為Key
proxy_cache_valid 為不同的狀態碼設定快取有效期

現在我們開始演示

修改nginx配置,如圖:

配置好後,./sbin/nginx -t  檢測一下  ,這是注意不能用 ./sbin/nginx -s reload 熱部署方式重啟,必須用 ./sbin/nginx -s stop停止

然後 ./sbin/nginx 開啟nginx

接著,我們在web1 服務的webapps/Root 建立 hello.html,寫上

瀏覽器訪問該頁面 

然後我們在修改hello.html檔案   該 V.1.0  ---->  V.2.0,清除瀏覽器快取,在訪問該頁面,可以發現頁面還是 V.1.0

所以,我們配置的快取是有效的 

我們也可以看快取檔案

快取的清除:

該功能可以採用第三方模組 ngx_cache_purge 實現。

為nginx 新增 ngx_cache_purge 模組 

#下載ngx_cache_purge 模組包 ,這⾥nginx 版本為1.6.2 purge 對應2.0版

wget http://labs.frickle.com/files/ngx_cache_purge-2.0.tar.gz
#解壓檔案

#檢視已安裝模組
./sbin/nginx -V

#進⼊nginx安裝包⽬錄 重新安裝 --add-module為模組解壓的全路徑

./configure --prefix=/root/svr/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pakcages/pcre-8.35 --add-module=/usr/local/src/pakcages/ngx_cache_purge-2.0

#重新編譯 make      #make之後會在objs/nginx中生成新的nginx

#拷⻉ 安裝⽬錄/objs/nginx ⽂件⽤於替換原nginx ⽂件    #在這之前最好先備份之前的nginx

#檢測檢視安裝是否成功

nginx -t  或者 ./sbin/nginx -V

清除配置:

location ~ /purge(/.*) {
    #允許訪問的IP
    allow 127.0.0.1;
    allow 192.168.0.193;
    #禁⽌訪問的IP
    deny all;
    #配置清除指定快取區和路徑(與proxy_cache_key⼀⾄)
    proxy_cache_purge cache_item $host$uri$is_args$args;
}

這個必須放在 location快取上面

重啟nginx,訪問hello.html頁面

現在,演示成功!!!