以下基于 OpenResty balancer_by_lua 配置指令, 利用 ngx.crc32_long 根据源地址与目的端口生成hash, 实现一个简单的 ip_hash upstream. 仅供参考
upstream backend{
server 0.0.0.0;
balancer_by_lua_block {
local balancer = require "ngx.balancer"
local host = {"192.168.1.111", "192.168.1.112"}
local backend = ""
local port = ngx.var.server_port
local remote_ip = ngx.var.remote_addr
local key = remote_ip..port
local hash = ngx.crc32_long(key);
hash = (hash % 2) + 1
backend = host[hash]
ngx.log(ngx.DEBUG, "ip_hash=", ngx.var.remote_addr, " hash=", hash, " up=", backend, ":", port)
local ok, err = balancer.set_current_peer(backend, port)
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, ":", port)
}
}
server {
listen 80;
listen 8080;
listen 7777;
server_name *.x.com
location / {
proxy_pass http://backend;
}
}
参考: