zoukankan      html  css  js  c++  java
  • Nginx内嵌Lua脚本提高分布式缓存命中率

    解决问题:负载均衡的时候,假如业务逻辑主机有四台(A,B,C,D),虽然配置ip_hash(ji),这只是实现同一个ip去请求一个上层业务服务器(可以解决session的问题),但是现在,如果要实现一个商品页面的缓存内容只缓存在一台服务器A (所有关于这个页面请求都丢给A服务器,BCD服务器没有关于这个页面的缓存内容),极大程度的节省了服务器的存储空间。

    首先查看当前服务器的版本:nginx  -V (注:根据我的测试,可以增加 lua 模块的版本对也nginx的版本有要求,最低版本是:nginx/1.6.0)

     安装Lua,和这个业务中需要相应的代码包模块:

    1、安装lua

      wget  http://luajit.org/download/LuaJIT-2.0.5.tar.gz 

      tar -zxvf  LuaJIT-2.0.5.tar.gz

    cd  LuaJIT-2.0.5

    make install PREFIX=/usr/local/LuaJIT

    2/etc/profile 文件中加入环境变量

    export LUAJIT_LIB=/usr/local/LuaJIT/lib      

    export LUAJIT_INC=/usr/local/LuaJIT  #路径是上面luajit实际安装路径,路径错误安装nginxlua模块时会报错很找不到luajit

    下载相应的模块:

    1.下载ngx_devel_kit模块

    wget  https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz

    2.下载lua-nginx-module模块

    wget  https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz

    解压后,重新编译nginx  引入相应的模块:

    --add-module=/root/nginx-lua/lua-nginx-module-0.10.9rc7  --add-module=/root/nginx-lua/ngx_devel_kit-0.3.0

    编写相应的nginx 配置(记得执行:nginx -s reload  否在配置不生效)

    upstream.lua的代码编写:

    local  uri_args=ngx.req.get_uri_args()
    local  id=uri_args["id"]
    local  server={"193.45.126.217:9502","193.45.126.217:9503"}
    local  hash=ngx.crc32_long(id)
    local  index=(hash % table.getn(server))+1
    url="http://"..server[index]
    local  http=require("resty.http")
    local  httpClient=http.new()
    local  resp,err = httpClient:request_uri(url,{method="GET"})
    if not resp then 
          ngx.say(err)
          return
    end
    ngx.say(resp.body)
    
    httpClient:close()

    为了方便测试,我用Swoole创建了两台http服务器,分别是端口9502,9503http服务器。

    9502Http服务器

    <?php
    $http=new swoolehttpserver('0.0.0.0',9502);
    
    $http->on('request',function ($request, $response){
        $response->end('<h1>9502:'.date('m-d H:i:s').'</h1>');
    });
    
    $http->start();

     9503Http服务器

    <?php
    $http=new swoolehttpserver('0.0.0.0',9503);
    
    $http->on('request',function ($request, $response){
    
        var_dump($request);
    
        $response->end('<h1>9502:'.date('m-d H:i:s').'</h1>');
    
    });
    
    $http->start();
  • 相关阅读:
    我孤独吗?我软弱吗?
    DataGrid 中的 HyperLinkColumn 如何传递多个参数?(未整理)
    C# 获取 MAC地址!
    (文本)文件操作
    ioninfinitescroll实现上拉分页加载更多
    前端面试题:防抖的实现
    vue 传送门功能,实现模态窗口
    前端面试题:节流的实现( 减少一段时间的触发频率)
    vue中的render函数
    ionic5实现tab栏切换效果
  • 原文地址:https://www.cnblogs.com/zhengweizhao/p/10131627.html
Copyright © 2011-2022 走看看