上一篇 kafka + ehcache + redis 整合 實(shí)現(xiàn)二級(jí)緩存數(shù)據(jù)服務(wù), 主要講解實(shí)現(xiàn)了 三層緩存架構(gòu)中的本地堆緩存 + redis 分布式緩存,那么本篇我們就來(lái)聊了聊第三層 ( nginx 緩存) ,那為什么要講nginx 呢,不就是部署多套nginx 不就完了么,對(duì),這個(gè)沒(méi)錯(cuò),但是如果只是部署多套nginx ,那么由于 負(fù)載均衡 作用,導(dǎo)致緩存的命中率是比較低的,所以我們就來(lái)講講 如何提升緩存命中率 ?
圖解 nginx 緩存命中率低下原因?
上圖已經(jīng)很清楚的描述了nginx 緩存命中率低下問(wèn)題,那么怎么解決呢,如何提高,其實(shí)也很簡(jiǎn)單,就是相同的id 路由到相同的nginx 服務(wù)器中就可以了,如下圖所示:
后端的nginx服務(wù)器,就稱(chēng)之為應(yīng)用服務(wù)器; 最前端的nginx服務(wù)器,被稱(chēng)之為分發(fā)服務(wù)器
nginx分發(fā)層,負(fù)責(zé)流量分發(fā)的邏輯和策略,可以自定義分發(fā)的規(guī)則,比如根據(jù) productId 進(jìn)行 hash,然后對(duì)后端的nginx數(shù)量取模
nginx應(yīng)用層,負(fù)責(zé)數(shù)據(jù)緩存
將某一個(gè)商品的訪問(wèn)的請(qǐng)求,就固定路由到一個(gè)nginx后端服務(wù)器上去,保證了只會(huì)從redis中獲取一次緩存數(shù)據(jù),后面全都是走nginx本地緩存了
“分發(fā)層 + 應(yīng)用層 ” 雙層nginx 架構(gòu),在實(shí)際的生產(chǎn)環(huán)境中,可以大幅度提升你的nginx本地緩存這一層的命中率,大幅度減少redis后端的壓力,提升性能
如何搭建 分發(fā)層 + 應(yīng)用層 雙層nginx 架構(gòu)呢?
這里的雙層nginx 架構(gòu) 是結(jié)合 lua 開(kāi)發(fā),通過(guò) openresty web 平臺(tái) 運(yùn)行,OpenResty?
是一個(gè)基于 Nginx 與 Lua 的高性能 Web 平臺(tái)。
注:這里不介紹openresty 是什么東西了,您可以 點(diǎn)擊這里 openresty 查看,后續(xù)的熱點(diǎn)數(shù)據(jù)的自動(dòng)降級(jí)機(jī)制 其實(shí)也是用到lua,這里可以先預(yù)熱下
下面先把環(huán)境搭建起來(lái)
首先 這里部署應(yīng)用層nginx,采用openResty 的方式去部署nginx (部署節(jié)點(diǎn):192.168.0.16),同時(shí)開(kāi)發(fā)一個(gè) nginx + lua 的 hello wold
openresty 安裝部署
- 創(chuàng)建目錄
mkdir -p /usr/local/servers && cd /usr/local/servers
- 安裝依賴(lài)
yum install -y readline-devel pcre-devel openssl-devel gcc
- 安裝openResty (也稱(chēng)為 ngx_openresty ,是一個(gè)全功能的 Web 應(yīng)用服務(wù)器,它打包了標(biāo)準(zhǔn)的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數(shù)依賴(lài)項(xiàng))之 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 后端服務(wù)器健康檢查模塊 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 版本 并 啟動(dòng) nginx
-
查看目錄
cd /usr/local/servers/ && ll
-
查看nginx 版本
/usr/local/servers/nginx/sbin/nginx -V
-
啟動(dòng) nginx
/usr/local/servers/nginx/sbin/nginx
-
到這里使用openResty 部署 nginx + lua 完畢。
nginx + lua 的 hello wold
- 創(chuàng)建 lua.conf
cd /usr/local/servers/nginx/conf && vim lua.conf
添加以下內(nèi)容:
server {
listen 80;
server_name _;
}
- 引入依賴(lài)
vi /usr/local/servers/nginx/conf/nginx.conf
在 http 中加入以下內(nèi)容:
lua_package_path "/usr/local/servers/lualib/?.lua;;";
lua_package_cpath "/usr/local/servers/lualib/?.so;;";
include lua.conf;
- 驗(yàn)證 配置是否正確
/usr/local/servers/nginx/sbin/nginx -t
- 輸出 hello world
vim /usr/local/servers/nginx/conf/lua.conf
在 server 中 加入以下內(nèi)容:
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;
}
- 驗(yàn)證 配置是否正確
/usr/local/servers/nginx/sbin/nginx -t
- nginx 配置重載
/usr/local/servers/nginx/sbin/nginx -s reload
- 驗(yàn)證hello world
瀏覽器中訪問(wèn) 》http://192.168.0.16/lua
- 查看異常日志
tail -f /usr/local/servers/nginx/logs/error.log
以上方式都是直接在nginx 中編寫(xiě)lua 腳本
下面以工程化 nginx + lua 項(xiàng)目結(jié)構(gòu)的方式講解下
nginx + lua 項(xiàng)目結(jié)構(gòu)如下:
----- test
--------- test.conf
--------- lua
------------- test.lua
--------- lualib
------------- *.lua
------------- *.so
- 創(chuàng)建 test 項(xiàng)目
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;
}
}
- 編寫(xiě) test.lua 腳本文件
vim /usr/local/test/lua/test.lua
ngx.say("hello world, this is my test nginx + lua project");
- 拷貝依賴(lài)庫(kù)
cp -r /usr/local/servers/lualib/* /usr/local/test/lualib/
- test 項(xiàng)目 配置到 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;
- 驗(yàn)證 配置是否正確
/usr/local/servers/nginx/sbin/nginx -t
- nginx 配置重載
/usr/local/servers/nginx/sbin/nginx -s reload
- 驗(yàn)證 test 項(xiàng)目
瀏覽器中訪問(wèn) 》http://192.168.0.16/test
好了,openResty 部署 nginx + lua 應(yīng)用層完畢,同理在192.168.0.17 再部署一個(gè)相同的應(yīng)用層,后續(xù)用到。
以上就是本章內(nèi)容,如有不對(duì)的地方,請(qǐng)多多指教,謝謝!
為了方便有需要的人,本系列全部軟件都在 https://pan.baidu.com/s/1qYsJZfY
下章預(yù)告:主要講解 “分發(fā)層 + 應(yīng)用層” 雙層nginx 架構(gòu) 之 分發(fā)層
作者:逐暗者 (轉(zhuǎn)載請(qǐng)注明出處)