上一篇 kafka + ehcache + redis 整合 實現二級緩存數據服務, 主要講解實現了 三層緩存架構中的本地堆緩存 + redis 分布式緩存,那么本篇我們就來聊了聊第三層 ( nginx 緩存) ,那為什么要講nginx 呢,不就是部署多套nginx 不就完了么,對,這個沒錯,但是如果只是部署多套nginx ,那么由于 負載均衡 作用,導致緩存的命中率是比較低的,所以我們就來講講 如何提升緩存命中率 ?
圖解 nginx 緩存命中率低下原因?
上圖已經很清楚的描述了nginx 緩存命中率低下問題,那么怎么解決呢,如何提高,其實也很簡單,就是相同的id 路由到相同的nginx 服務器中就可以了,如下圖所示:
后端的nginx服務器,就稱之為應用服務器; 最前端的nginx服務器,被稱之為分發服務器
nginx分發層,負責流量分發的邏輯和策略,可以自定義分發的規則,比如根據 productId 進行 hash,然后對后端的nginx數量取模
nginx應用層,負責數據緩存
將某一個商品的訪問的請求,就固定路由到一個nginx后端服務器上去,保證了只會從redis中獲取一次緩存數據,后面全都是走nginx本地緩存了
“分發層 + 應用層 ” 雙層nginx 架構,在實際的生產環境中,可以大幅度提升你的nginx本地緩存這一層的命中率,大幅度減少redis后端的壓力,提升性能
如何搭建 分發層 + 應用層 雙層nginx 架構呢?
這里的雙層nginx 架構 是結合 lua 開發,通過 openresty web 平臺 運行,OpenResty?
是一個基于 Nginx 與 Lua 的高性能 Web 平臺。
注:這里不介紹openresty 是什么東西了,您可以 點擊這里 openresty 查看,后續的熱點數據的自動降級機制 其實也是用到lua,這里可以先預熱下
下面先把環境搭建起來
首先 這里部署應用層nginx,采用openResty 的方式去部署nginx (部署節點:192.168.0.16),同時開發一個 nginx + lua 的 hello wold
openresty 安裝部署
- 創建目錄
mkdir -p /usr/local/servers && cd /usr/local/servers
- 安裝依賴
yum install -y readline-devel pcre-devel openssl-devel gcc
- 安裝openResty (也稱為 ngx_openresty ,是一個全功能的 Web 應用服務器,它打包了標準的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數依賴項)之 luajit 編譯及安裝
wget http://openresty.org/download/ngx_openresty-1.7.7.2.tar.gz
tar -xzvf ngx_openresty-1.7.7.2.tar.gz && cd ngx_openresty-1.7.7.2/bundle/LuaJIT-2.1-20150120
make clean && make && make install
ln -sf luajit-2.1.0-alpha /usr/local/bin/luajit
- 安裝nginx 緩存清理模塊ngx_cache_purge
cd /usr/local/servers/ngx_openresty-1.7.7.2/bundle
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
tar -xvf 2.3.tar.gz
- 安裝 nginx 后端服務器健康檢查模塊 nginx_upstream_check_module
cd /usr/local/servers/ngx_openresty-1.7.7.2/bundle
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz
tar -xvf v0.3.0.tar.gz
- openResty 編譯安裝
cd /usr/local/servers/ngx_openresty-1.7.7.2
./configure --prefix=/usr/local/servers --with-http_realip_module --with-pcre --with-luajit --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/ -j2
make && make install
- 查看 servers 目錄、查看nginx 版本 并 啟動 nginx
-
查看目錄
cd /usr/local/servers/ && ll
-
查看nginx 版本
/usr/local/servers/nginx/sbin/nginx -V
-
啟動 nginx
/usr/local/servers/nginx/sbin/nginx
-
到這里使用openResty 部署 nginx + lua 完畢。
nginx + lua 的 hello wold
- 創建 lua.conf
cd /usr/local/servers/nginx/conf && vim lua.conf
添加以下內容:
server {
listen 80;
server_name _;
}
- 引入依賴
vi /usr/local/servers/nginx/conf/nginx.conf
在 http 中加入以下內容:
lua_package_path "/usr/local/servers/lualib/?.lua;;";
lua_package_cpath "/usr/local/servers/lualib/?.so;;";
include lua.conf;
- 驗證 配置是否正確
/usr/local/servers/nginx/sbin/nginx -t
- 輸出 hello world
vim /usr/local/servers/nginx/conf/lua.conf
在 server 中 加入以下內容:
location /lua {
default_type 'text/html';
content_by_lua 'ngx.say("hello world")';
}
為了代碼清晰,可以將 lua 邏輯腳本從lua.conf 分離,故:
將上面的 ngx.say("hello world");
代碼分離到test.lua 文件中
mkdir /usr/local/servers/nginx/conf/lua && vi /usr/local/servers/nginx/conf/lua/test.lua
修改lua.conf
vim /usr/local/servers/nginx/conf/lua.conf
location /lua {
default_type 'text/html';
content_by_lua_file conf/lua/test.lua;
}
- 驗證 配置是否正確
/usr/local/servers/nginx/sbin/nginx -t
- nginx 配置重載
/usr/local/servers/nginx/sbin/nginx -s reload
- 驗證hello world
瀏覽器中訪問 》http://192.168.0.16/lua
- 查看異常日志
tail -f /usr/local/servers/nginx/logs/error.log
以上方式都是直接在nginx 中編寫lua 腳本
下面以工程化 nginx + lua 項目結構的方式講解下
nginx + lua 項目結構如下:
----- test
--------- test.conf
--------- lua
------------- test.lua
--------- lualib
------------- *.lua
------------- *.so
- 創建 test 項目
mkdir /usr/local/test
- 配置 test.conf 文件
vim /usr/local/test/test.conf
server {
listen 80;
server_name _;
location /test {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file /usr/local/test/lua/test.lua;
}
}
- 編寫 test.lua 腳本文件
vim /usr/local/test/lua/test.lua
ngx.say("hello world, this is my test nginx + lua project");
- 拷貝依賴庫
cp -r /usr/local/servers/lualib/* /usr/local/test/lualib/
- test 項目 配置到 nginx.conf
vim /usr/local/servers/nginx/conf/nginx.conf
在http 中配置:
lua_package_path "/usr/local/test/lualib/?.lua;;";
lua_package_cpath "/usr/local/test/lualib/?.so;;";
include /usr/local/test/test.conf;
- 驗證 配置是否正確
/usr/local/servers/nginx/sbin/nginx -t
- nginx 配置重載
/usr/local/servers/nginx/sbin/nginx -s reload
- 驗證 test 項目
瀏覽器中訪問 》http://192.168.0.16/test
好了,openResty 部署 nginx + lua 應用層完畢,同理在192.168.0.17 再部署一個相同的應用層,后續用到。
以上就是本章內容,如有不對的地方,請多多指教,謝謝!
為了方便有需要的人,本系列全部軟件都在 https://pan.baidu.com/s/1qYsJZfY
下章預告:主要講解 “分發層 + 應用層” 雙層nginx 架構 之 分發層
作者:逐暗者 (轉載請注明出處)