26 “分發層 + 應用層” 雙層nginx 架構 之 應用層

上一篇 kafka + ehcache + redis 整合 實現二級緩存數據服務, 主要講解實現了 三層緩存架構中的本地堆緩存 + redis 分布式緩存,那么本篇我們就來聊了聊第三層 ( nginx 緩存) ,那為什么要講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

查看 servers 目錄、查看nginx 版本
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")';  
    } 
輸出 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; 
    }
  • 驗證 配置是否正確

/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 中編寫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 項目

好了,openResty 部署 nginx + lua 應用層完畢,同理在192.168.0.17 再部署一個相同的應用層,后續用到。

以上就是本章內容,如有不對的地方,請多多指教,謝謝!

為了方便有需要的人,本系列全部軟件都在 https://pan.baidu.com/s/1qYsJZfY

下章預告:主要講解 “分發層 + 應用層” 雙層nginx 架構 之 分發層

作者:逐暗者 (轉載請注明出處)

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

推薦閱讀更多精彩內容