最近接触打点相关需求,因服务是lvs,请求的机器具有随机性。所以接触到了nginx反向代理,这里是应用于openresty服务的配置当中,使用ngx.balancer。看了一些博客,又向各位大佬们学到了很多~
反向代理
反向代理(Reverse Proxy):指来自用户的请求,访问代理服务器,然后代理服务器通过一些判断,将请求发送到某台服务器,发送成功后,将接收到的数据返回至用户。此时代理服务器就为一台反向代理服务器。
应用场景:本次应用场景是使同一用户的请求发送至同一台服务器,根据用户uid或sid来判断。
upstream实现简单的负载均衡
访问nginx服务80端口,请求随机发送server 1~3
upstream test {
server 192.168.0.1;
server 192.168.0.2;
server 192.168.0.3;
}
server {
location / {
listen 80;
proxy_pass http://test;
}
}
upstream在conf/nginx.conf配置
访问服务80端口,请求到达upstream,获取uid作为key,如果无uid则使用sid作为key,如果均没有,贼使用随机数。进行hash映射到对应的host,从而达到同一用户请求同一机器。
upstream change {
server 0.0.0.0;
balancer_by_lua_block {
local balancer = require "ngx.balancer"
local host = {"1.1.1.1", "2.2.2.2"} #服务所在的机器列表
local backend = ""
local port = 8088
local key = ngx.var.arg_uid or ""
if key == "" then
key = ngx.var.arg_sid or ""
end
if key == "" then
key = math.random(1,1000)
end
local hash = ngx.crc32_long(key);
hash = (hash % 2) + 1
backend = host[hash]
ngx.log(ngx.INFO, "upstream test"," key:", key, " hash:", hash, " host:", change, " ip:", ngx.var.remote_addr)
local ok, err = balancer.set_current_peer(change, port)
if not ok then
ngx.log(ngx.ERR, "failed to set : ", err)
return ngx.exit(500)
end
}
}
server {
listen 80;
access_log /dev/null;
location / {
proxy_pass http://change;
}
}
网友评论