使用balancer_by_lua_block做应用层负载均衡
首先感谢章义春大神的openresty,解决了web开发的一些痛点并简化了web开发的复杂度。 需求: 根据url的一个参数,做负载均衡,使得某一个用户总是被分配到固定的业务服务器上处理,方便后续的业务处理,做缓存或单元化架构部署 假设这个参数为dvid,一共有两个业务服务器,8088端口和8089端口,分别返回hello和world
server{ listen 8088; location /hello { content_by_lua ' ngx.say("hello") '; } } server{ listen 8089; location /hello { content_by_lua ' ngx.say("world") '; } } upstream ?balancer_by_lua_block的配置: ? ? upstream backend{ ? ? ? ? ? server 0.0.0.0; ? ? ? ? ? balancer_by_lua_block { ?? ? ? ? ? ? ? local balancer = require "ngx.balancer" ? ? ? ? ? ? ? ? local port = {8088,8089} ? ? ? ? ? ? ? ? local backend = "" ? ? ? ? ? ? ? local dvid = ngx.req.get_uri_args()["dvid"] or 0 ? ? ? ? ? ? ngx.log(ngx.ERR,"dvid=",dvid) ? ? ? ? ? ? local hash = (dvid % 2) + 1 ?? ? ? ? ? ? ? ngx.log(ngx.ERR,"hash=",hash) ? ? ? ? ? ? backend = port[hash] ? ? ? ? ? ? ? ngx.log(ngx.ERR,"backend=",backend) ? ? ? ? ? ? ngx.log(ngx.ERR,dvid," hash=",hash," up=",backend) ? ? ? ? ? ? ? local ok,err = balancer.set_current_peer("127.0.0.1",backend) ? ? ? ? ? ? ? if not ok then ? ? ? ? ? ? ? ? ? ngx.log(ngx.ERR,"failed to set the current peer: ",err) ? ? ? ? ? ? ? ? ? return ngx.exit(500) ? ? ? ? ? ? ? end ? ? ? ? ? ? ? ngx.log(ngx.DEBUG,"current peer ",backend) ? ? ? ? ? } ?? ? ? }? 接收业务请求的server: server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /hello { proxy_pass http://backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }测试: http://localhost/hello?dvid=1? ?返回world http://localhost/hello?dvid=2? ?返回hello 测试结果OK openresty安装: https://openresty.org/en/download.html wget?https://openresty.org/download/openresty-1.11.2.2.tar.gz tar zxf openresty-1.11.2.2.tar.gz cd openresty-1.11.2.2/ ./configure --with-luajit&& make && make install 参考: http://weibo.com/1834459124/DaEmgBhlD?from=singleweibo&mod=recommand_weibo&type=comment#_rnd1479734607640 http://blog.csdn.net/force_eagle/article/details/52224660 http://www.wtoutiao.com/p/177SJDc.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |