美文网首页程序猿首页投稿(暂停使用,暂停投稿)程序员
26 “分发层 + 应用层” 双层nginx 架构 之 应用层

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

作者: 逐暗者 | 来源:发表于2017-08-27 01:38 被阅读0次

    上一篇 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 架构 之 分发层

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

    相关文章

      网友评论

        本文标题:26 “分发层 + 应用层” 双层nginx 架构 之 应用层

        本文链接:https://www.haomeiwen.com/subject/oyjvdxtx.html