使用OpenResty做策略反向代理

背景

HTTP反向代理是一个在日常运维里面常见的功能需求,往往起到负载均衡、灾备和安全的效果,目前用得比较多的HTTP反向代理有nginx、haproxy等。最近我们有一个需求,希望HTTP反向代理服务器可以由URL参数来指定转发后端的HTTP服务器地址,同时希望这些参数可以加密,避免明文的方式暴露了后端HTTP服务器地址等敏感信息。如果只是根据URL里面的参数来指定后端HTTP服务器haproxy的acl功能可以实现,但是URL内容加密过的需要在HTTP反向代理解密haproxy就无法实现了。OpenResty这个项目则可以完美地实现我们的业务需求,估计也是这种来自HTTP反向代理的基础需求很普遍的原因,催生了类似OpenResty的项目,下面我们先介绍一个OpenResty是什么东东。

OpenRsety介绍

我们直接上一段OpenResty官网的自我介绍:

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

可以看到,OpenResty的功能非常强大,我们只是用了其中的冰山一角而已,下面我们先介绍安装,然后再是使用案例。

OpenRsety安装

OpenResty的安装非常简单,官网本身就介绍得很详细,我这里用的是Ubuntu18.04环境,并以此作为演示。

#安装官方指定的基础包
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

OpenRsety使用

我们以文章开头的需求为实际案例,讲解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;

  }

 }

}

配置文件主要有两个接口,第一个接口8080端口配置的是用于加密指定内容,比如我需要加密后端HTTP地址是 1.1.1.1,那么我们就调用接口 http://OpenResty配置地址:8080/?data=1.1.1.1 ,接口会返回一串加密后的16进制字符串,然后我们再用这个字符串作为参数去访问这个HTTP反向代理 http://OpenResty配置地址/?host=加密内容&其他参数…. ,OpenResty就会解密出host加密内容,然后把URL转发到host指定的 1.1.1.1 后端HTTP服务器处理。

配置文件里面,用户需要定义自己的加密key,我们这个例子用的是aes对称加密,所以把加密、解密的接口都放在一起配置。OpenResty用到的是lua语言,所以需要有一定的lua基础,同时需要熟悉OpenResty提供的lua库,这些库非常的多而且实用,可以满足大部分HTTP处理的需求。有兴趣想深入了解的,可以上去OpenResty官网多浏览学习。

睿江云官网链接:http://www.eflycloud.com/#register?salesID=6DGNUTUAV

你可能感兴趣的:(使用OpenResty做策略反向代理)