使用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配置地址:8080https://blog.csdn.net/?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
- 点赞 1eee0
- 收藏
- 分享
- 文章举报
- NetOk(免费反向代理)+VS2017远程调试实战
- NetOk(免费反向代理)+访问内网网站
- 20170406-mysql-ab复制-双向复制-反向代理-读写分离
- 使用Nginx反向代理豆瓣Api电影接口(解决微信小程序频繁调用api被关小黑屋)
- Howto: 如何通过IIS7为ArcGIS Server配置反向代理系统架构
- 通过nginx反向代理来调试代码的实现
- 正向代理和反向代理
- Nginx 反向代理获取真实IP问题
- 反向代理设置/axios请求数据
- nginx反向代理+负载均衡
- nginx的反向代理
- nginx反向代理websocket 小坑
- nodejs+socket.io用nginx反向代理提示400 Bad Request及ws://…无法连接的解决方法
- nginx反向代理、负载均衡以及动静分离
- 记录Nginx+Keepalived+Tomcat反向代理高可用Web集群部署
- Apache 反向代理快速配置
- windows下 nodejs 配置域名 nginx配置反向代理
- (五).windows系统下实现简单的反向代理
- (六)在Linux系统中实现简单的反向代理
- 关于某视频里leyou商城通过虚拟机的nginx反向代理访问本机后台管理系统的问题汇总