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頁面
現在,演示成功!!!