使用OpenResty做策略反向代理
HTTP反向代理是一个在日常运维里面常见的功能需求,往往起到负载均衡、灾备和安全的效果,目前用得比较多的HTTP反向代理有nginx、haproxy等。最近我们有一个需求,希望HTTP反向代理服务器可以由URL参数来指定转发后端的HTTP服务器地址,同时希望这些参数可以加密,避免明文的方式暴露了后端HTTP服务器地址等敏感信息。如果只是根据URL里面的参数来指定后端HTTP服务器haproxy的acl功能可以实现,但是URL内容加密过的需要在HTTP反向代理解密haproxy就无法实现了。OpenResty这个项目则可以完美地实现我们的业务需求,估计也是这种来自HTTP反向代理的基础需求很普遍的原因,催生了类似OpenResty的项目,下面我们先介绍一个OpenResty是什么东东。
#安装官方指定的基础包
apt-get install libpcre3-dev \
libssl-dev perl make build-essential curl
#下载OpenResty源码包编译
#在/opt目录下执行,具体版本用户根据官网下载页面而定
wget https://openresty.org/download/openresty-1.13.6.2.tar.gz
#解压进入目录编译安装
tar zxf openresty-1.13.6.2.tar.gz
cd openresty-1.13.6.2
./configure --prefix=/opt/openresty
make && make install
#一切顺利的话,/opt/openresty目录就有以下文件
bin COPYRIGHT luajit lualib nginx pod resty.index site
我们以文章开头的需求为实际案例,讲解OpenResty的使用,编辑配置文件/opt/openresty/nginx/conf/nginx.conf内容如下所示:
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
#加密接口
server {
listen 8080;
location / {
default_type text/html;
content_by_lua '
local aes = require "resty.aes"
local str = require "resty.string"
local aes_128_cbc_md5 = aes:new("用户自定义秘钥内容")
local data = ngx.var.arg_data
local encrypted = aes_128_cbc_md5:encrypt(data)
ngx.say(str.to_hex(encrypted))
';
}
}
#HTTP反向代理接口
server {
listen 80;
#根据实际配置域名
#server_name xxx.com;
location / {
set $backend "";
set_by_lua $backend '
local h2b = {
["0"] = 0, ["1"] = 1, ["2"] = 2, ["3"] = 3, ["4"] = 4, ["5"] = 5, ["6"] = 6, ["7"] = 7, ["8"] = 8, ["9"] = 9, ["A"] = 10, ["B"] = 11, ["C"] = 12, ["D"] = 13, ["E"] = 14, ["F"] = 15 }
local function hexstr2bin(hexstr)
local s = string.gsub(string.upper(hexstr), "(.)(.)", function ( h, l )
return string.char(h2b[h]*16+h2b[l]) end)
return s
end
local aes = require "resty.aes"
local str = require "resty.string"
local aes_128_cbc_md5 = aes:new("用户自定义秘钥内容")
local host = ngx.var.arg_host
host = aes_128_cbc_md5:decrypt(hexstr2bin(host))
return host
';
proxy_pass http://$backend;
}
}
}
睿江云官网链接:https://www.eflycloud.com/home?from=RJ0032