首先感谢章义春大神的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=", 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 {
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