龙空技术网

nginx动态proxy_pass

程序员升级之路 156

前言:

如今兄弟们对“nginx添加proxy”大约比较看重,同学们都想要学习一些“nginx添加proxy”的相关资讯。那么小编同时在网摘上网罗了一些有关“nginx添加proxy””的相关文章,希望朋友们能喜欢,同学们一起来了解一下吧!

有时我们想根据用户请求的参数转发到不同的upstream,像做多机房用户路由的时候是非常有用的,实现有多种方式,一是设置不同的loction,然后让lua动态执行不同的子请求;还有就是将upstream设置成变量,让lua动态计算出返回哪个upstream;

下面演示第二种方式,假设我们的域名为aa.com,nginx配置如下:

upstream order0{        server 127.0.0.1:12580;}upstream order1{        server 127.0.0.1:11580;}server {  listen 443 ssl;  server_name aa.com;   location / {     set_by_lua_file $ups /data/lua/upsteam.lua;        add_header X-CLOSED 0;    proxy_pass_header Server;    proxy_set_header Host $http_host;    proxy_redirect off;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    proxy_set_header X-Forwarded-Proto $scheme;    proxy_set_header Accept-Encoding "";     proxy_set_header X-Scheme $scheme;    client_max_body_size 200m;    proxy_pass ;  }}

上面的配置设置了2个upsteam,通过set_by_lua_file指令设置变量ups,然后请求到ups变量指向的upstream中,lua代码如下:

--ip to hash函数function iptolong(ip)    local first_index = 1    local last_index = 1    local cur_index=1    local arr = {}    local res    local split_str	    split_str = "%."    while true do       first_index,_  = string.find(ip, split_str, last_index)       if nil == first_index then        arr[cur_index] = string.sub(ip, last_index, string.len(ip))        break       end       arr[cur_index] = string.sub(ip, last_index, first_index - 1)       last_index = first_index + 1       cur_index = cur_index + 1    end	    res = tonumber(arr[1])*256*256*256;    res = res + tonumber(arr[2])*65536;    res =res + tonumber(arr[3])*256;    res = res + tonumber(arr[4]);    return resendlocal ip = ngx.var.remote_addr;local ip_haship_hash = iptolong(ip) % 2;if ip_hash == 1 then	return "order1"else  return "order0"end

上面我们根据用户的IP做Hash计算,结果为0的返回order0,反之返回order1,即不同的IP返回不同的Upstream;然后可以在浏览器访问 aa.com的一个地址,可以让每个服务器返回不同的东西就可以看到效果了。

标签: #nginx添加proxy