使用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 #解压进入目录编译安装 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 ; } } }

配置文件主要有两个接口,第一个接口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官网多浏览学习。

文章来自:睿江云计算

睿江云官网链接:

睿江云主机租用-云服务器-支持免费测试-国内专业的云主机提供商​www.eflycloud.com/#register?salesID=6DGNUTUAV