云服务器

使用OpenResty做策略反向代理

2019-12-05 14:58:07 154
背景

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环境,并以此作为演示。



  1. #安装官方指定的基础包
  2. apt-get install libpcre3-dev \
  3. libssl-dev perl make build-essential curl

  4. #下载OpenResty源码包编译
  5. #在/opt目录下执行,具体版本用户根据官网下载页面而定
  6. wget https://openresty.org/download/openresty-1.13.6.2.tar.gz

  7. #解压进入目录编译安装
  8. tar zxf openresty-1.13.6.2.tar.gz
  9. cd openresty-1.13.6.2
  10. ./configure --prefix=/opt/openresty
  11. make && make install

  12. #一切顺利的话,/opt/openresty目录就有以下文件
  13. bin COPYRIGHT luajit lualib nginx pod resty.index site


OpenRsety使用

我们以文章开头的需求为实际案例,讲解OpenResty的使用,编辑配置文件/opt/openresty/nginx/conf/nginx.conf内容如下所示:



  1. worker_processes 1;

  2. error_log logs/error.log;

  3. events {

  4. worker_connections 1024;

  5. }

  6. http {

  7. #加密接口

  8. server {

  9. listen 8080;

  10. location / {

  11. default_type text/html;

  12. content_by_lua '

  13. local aes = require "resty.aes"

  14. local str = require "resty.string"

  15. local aes_128_cbc_md5 = aes:new("用户自定义秘钥内容")


  16. local data = ngx.var.arg_data

  17. local encrypted = aes_128_cbc_md5:encrypt(data)

  18. ngx.say(str.to_hex(encrypted))

  19. ';

  20. }

  21. }


  22. #HTTP反向代理接口

  23. server {

  24. listen 80;

  25. #根据实际配置域名

  26. #server_name xxx.com;


  27. location / {

  28. set $backend "";

  29. set_by_lua $backend '


  30. local h2b = {

  31. ["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 }

  32. local function hexstr2bin(hexstr)

  33. local s = string.gsub(string.upper(hexstr), "(.)(.)", function ( h, l )

  34. return string.char(h2b[h]*16+h2b[l]) end)

  35. return s

  36. end


  37. local aes = require "resty.aes"

  38. local str = require "resty.string"

  39. local aes_128_cbc_md5 = aes:new("用户自定义秘钥内容")


  40. local host = ngx.var.arg_host

  41. host = aes_128_cbc_md5:decrypt(hexstr2bin(host))

  42. return host

  43. ';


  44. proxy_pass http://$backend;

  45.   }

  46.  }

  47. }


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



睿江云官网链接:https://www.eflycloud.com/home?from=RJ0032

上一篇: 无

微信关注

获取更多技术咨询