OpenResty 使用 balancer_by_lua_block 做负载均衡,需用到:

1)OpenResty的"ngx.balancer"模块

2)需调用 balancer.set_current_peer("127.0.0.1", port_random) 设置ip + port

 

编辑nginx配置文件:

cd /usr/local/openresty/nginx/

vim conf/nginx.conf

配置如下:

user                www www;
worker_processes    4;

error_log           logs/error.log;
pid                 logs/nginx.pid;

events {
    use                 epoll;
    multi_accept        on;
    worker_connections  102400;
}

## 处理 HTTP、HTTPS
http {

    include         mime.types;
    default_type    application/octet-stream;

    access_log      logs/access.log  main;

    keepalive_timeout   65;
    gzip                on;

    # 关闭lua缓存, 修改外部lua脚本时, 不用重启nginx
    lua_code_cache      off;

    ## server 8088
    server {
        listen                  8088;
        server_name             localhost;
        charset                 utf-8;

        location /balancer {
            default_type        text/html; 
            content_by_lua_block {
                ngx.say("balancer to 8088");
            }
        }
    }

    ## server 8089
    server {
        listen                  8089;
        server_name             localhost;
        charset                 utf-8;

        location /balancer {
            default_type        text/html; 
            content_by_lua_block {
                ngx.say("balancer to 8089");
            }
        }
    }

    ## 负载均衡[8088,8089]
    server {
        listen                  8099;
        listen                  8080;
        server_name             localhost;
        charset                 utf-8;

        location /balancer {
            default_type        text/html; 
            proxy_pass          http://server_balancer;
        }
    }

    ## 负载平衡: 8088, 8089
    upstream server_balancer {
        server          0.0.0.0;
        
        balancer_by_lua_block {
            local balancer = require "ngx.balancer"

            -- 内部端口映射服务
            local port = { 8088, 8089 }
            local port_random = ""

            -- 1. 入参端口做hash映射
            local port_params = ngx.req.get_uri_args()["port"] or 0
            ngx.log(ngx.ERR, "port_params = ", port_params)

            -- 2. 入参"ip:port"做hash映射
            local var_port = ngx.var.server_port
            local var_ip = ngx.var.remote_addr
            local var_key = var_ip .. ":" .. var_port
            local var_hash = ngx.crc32_long(var_key)
            local var_idx = (var_hash % 2) + 1
            port_random = port[var_idx]
            ngx.log(ngx.ERR, "var_port = ", var_port, ", var_ip = ", var_ip, ", var_key = ", var_key, 
                             ", var_hash = ", var_hash, ", var_idx = ", var_idx, ", port_random = ", port_random);

            -- 3. 获取系统随机数做hash
            math.randomseed(ngx.time())
            port_params = math.random(1, 100)

            local hash = (port_params % 2) + 1
            ngx.log(ngx.ERR, "hash = ", hash)

            port_random = port[hash]
            ngx.log(ngx.ERR, "port_random = ", port_random)
            ngx.log(ngx.ERR, "port_params = ", port_params, ", hash = ", hash, ", port_random = ", port_random)

            local ok, err = balancer.set_current_peer("127.0.0.1", port_random)
            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 success, port_random = ", port_random)
        }
    }
}

 

执行nginx命令,使脚本生效:

# openresty -t
nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/local/openresty/nginx/conf/nginx.conf:40
nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test is successful
#
# openresty -s reload
nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/local/openresty/nginx/conf/nginx.conf:40

 

访问链接,验证结果:

1)http://48.10.204.18:8088/balancer?port=2

显示结果:balancer to 8088

2)http://48.10.204.18:8088/balancer?port=2

显示结果:balancer to 8089

3)http://48.10.204.18:8080/balancer?port=2

显示结果:balancer to 8088  或  balancer to 8089   (随机显示端口号)

 

 

参考推荐:

OpenResty 搭建代理池

OpenResty = Nginx + Lua 介绍和安装教程