我这有一个解决方案,目前已经在生产环境使用。由于手机打字,我只写下简单流程。
lua代码:
local url = ''
local res,err = ngx.location.capture(url)
ngx.print(red.body)
Nginx中增加配置:
location ^http {
resolver 8.8.8.8;
proxy_pass http://$host$request_uri;
}
我的需求是这样:对于某些url,需要向其他远端地址proxy,但是这个proxy的地址不是之前就在配置文件中配置好的,而是需要实时的通过自己的私有协议去一个tcp server查询的,下面是我的实现方案:
set $proxy_addrs ''; //存储本次查询到的所有可以proxy的地址,tcp server可能会返回多个地址
set $next_address ''; //存储下一个尝试proxy的地址
location ~* (php|js)$/ {
content_by_lua_block {
require "dynamic".dynamic_request() //在这个lua函数中通过cosocket向tcp server查询,然后将查询结果为变量$proxy_addrs(tcp server可能返回多个地址,用这个变量存储所有的地址)和$next_address(下一个将要proxy的地址)赋值,然后执行ngx.exec(@proxy)
}
}
location @proxy {
proxy_pass http://$next_address; //向$next_address指向的地址proxy
error_page 504 500 502 503 = @next; //如果proxy失败内部定向到@next
}
location @next {
rewrite_by_lua_block {
require "dynamic".next_proxy_addr() //这个lua函数为变量$next_address重新赋值(从变量$proxy_addrs中取出下一个地址赋值给$next_address,变量$proxy_addrs存储了所有的可以proxy的地址),如果 所有的地址都已经尝试过,则该 lua函数直接返回错误给客户端,否则执行ngx.exec(@proxy)
}
}
请问大家对于我这种需求有没有其他更好的实现方式,自我感觉我这种实现方法并不太好,本来想着blance_by_lua中执行查询的逻辑并且为proxy的地址赋值,但是blance_by_lua中并不支持cosocket. 各位大神有没有什么好的提案能给赐教一下小弟吗?
--