26 “分發(fā)層 + 應(yīng)用層” 雙層nginx 架構(gòu) 之 應(yīng)用層

上一篇 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 緩存命中率低下原因?

nginx 緩存命中率低下原因

上圖已經(jīng)很清楚的描述了nginx 緩存命中率低下問(wèn)題,那么怎么解決呢,如何提高,其實(shí)也很簡(jiǎn)單,就是相同的id 路由到相同的nginx 服務(wù)器中就可以了,如下圖所示:

分發(fā)層 + 應(yīng)用層 架構(gòu) 解決緩存命中率低下

后端的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

查看 servers 目錄、查看nginx 版本
nginx 啟動(dòng)

到這里使用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

配置驗(yàn)證通過(guò)
  • 輸出 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")';  
    } 
輸出 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

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

hello world 完成
  • 查看異常日志

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)目

好了,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)注明出處)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,688評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,654評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評(píng)論 6 406
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,955評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,195評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,422評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,673評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,424評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容