26 “分发层 + 应用层” 双层nginx 架构 之 应用层

上一篇 kafka + ehcache + redis 整合 实现二级缓存数据服务, 主要讲解实现了 三层缓存架构中的本地堆缓存 + redis 分布式缓存,那么本篇我们就来聊了聊第三层 ( nginx 缓存) ,那为什么要讲nginx 呢,不就是部署多套nginx 不就完了么,对,这个没错,但是如果只是部署多套nginx ,那么由于 负载均衡 作用,导致缓存的命中率是比较低的,所以我们就来讲讲 如何提升缓存命中率

图解 nginx 缓存命中率低下原因?

26 “分发层 + 应用层” 双层nginx 架构 之 应用层_第1张图片
nginx 缓存命中率低下原因

上图已经很清楚的描述了nginx 缓存命中率低下问题,那么怎么解决呢,如何提高,其实也很简单,就是相同的id 路由到相同的nginx 服务器中就可以了,如下图所示:

26 “分发层 + 应用层” 双层nginx 架构 之 应用层_第2张图片
分发层 + 应用层 架构 解决缓存命中率低下

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

26 “分发层 + 应用层” 双层nginx 架构 之 应用层_第3张图片
查看 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")';  
    } 
26 “分发层 + 应用层” 双层nginx 架构 之 应用层_第4张图片
输出 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
    浏览器中访问 》http://192.168.0.16/lua
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 项目
    浏览器中访问 》http://192.168.0.16/test
26 “分发层 + 应用层” 双层nginx 架构 之 应用层_第5张图片
验证 test 项目

好了,openResty 部署 nginx + lua 应用层完毕,同理在192.168.0.17 再部署一个相同的应用层,后续用到。

以上就是本章内容,如有不对的地方,请多多指教,谢谢!

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

下章预告:主要讲解 “分发层 + 应用层” 双层nginx 架构 之 分发层

作者:逐暗者 (转载请注明出处)

你可能感兴趣的:(26 “分发层 + 应用层” 双层nginx 架构 之 应用层)