解决问题:负载均衡的时候,假如业务逻辑主机有四台(A,B,C,D),虽然配置ip_hash(ji),这只是实现同一个ip去请求一个上层业务服务器(能够解决session的问题),可是如今,若是要实现一个商品页面的缓存内容只缓存在一台服务器A (全部关于这个页面请求都丢给A服务器,BCD服务器没有关于这个页面的缓存内容),极大程度的节省了服务器的存储空间。php
首先查看当前服务器的版本:nginx -V (注:根据个人测试,能够增长 lua 模块的版本对也nginx的版本有要求,最低版本是:nginx/1.6.0)nginx
安装Lua,和这个业务中须要相应的代码包模块:git
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz github
tar -zxvf LuaJIT-2.0.5.tar.gz缓存
cd LuaJIT-2.0.5服务器
make install PREFIX=/usr/local/LuaJITswoole
export LUAJIT_LIB=/usr/local/LuaJIT/lib session
export LUAJIT_INC=/usr/local/LuaJIT #路径是上面luajit实际安装路径,路径错误安装nginx的lua模块时会报错很找不到luajit库负载均衡
下载相应的模块:测试
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 swoole\http\server('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 swoole\http\server('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();