天天看點

openresty,nginx+lua 實作根據url的參數反向代理

項目中有個特殊的需求,根據請求URL的參數,做不同的反向代理,比如:賽事ID<1000很少有人查詢的賽事,映射到配置不好的機器上。将現在的賽事ID映射到配置好的機器上。

經過調研,決定使用openresty。

安裝openresty

找到opentesty的官方文檔,進行安裝

​​​https://openresty.org/cn/installation.html​​

配置Nginx.conf

openresty,nginx+lua 實作根據url的參數反向代理
user root;
worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}




http {

upstream  ECC_NODE1  {
        server   172.16.74.71:9808;
}
upstream  ECC_NODE2  {
        server   172.16.214.241:9808;
}
upstream  ECC_NODE3  {
        server   10.29.180.242:9808;
}
    server {
        listen 80;
        server_name  ack.geexek.com;

        location / {
                set $backend '';
                rewrite_by_lua_file '/root/work/lua/test.lua';
                add_header Access-Control-Allow-Origin *;
                proxy_next_upstream error timeout http_500 http_502 http_504;
                proxy_read_timeout 60s;
                proxy_set_header   Host             $host;
                proxy_pass         http://ECC_$backend;
                proxy_set_header   X-Real-IP        $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_intercept_errors on;
                index  index.html index.htm;
        }


    }
}      

編寫lua的腳本

= tonumber(ngx.var.arg_cmptId)
--ngx.say('cmptId:'..cmptId)

if(cmptId==16)
then
        ngx.var.backend="NODE1";
elseif(cmptId==17)
then
        ngx.var.backend="NODE2";
else
        ngx.var.backend="NODE3";
end      

重新開機Nginx服務進行測試

openresty,nginx+lua 實作根據url的參數反向代理
openresty,nginx+lua 實作根據url的參數反向代理
openresty,nginx+lua 實作根據url的參數反向代理

繼續閱讀