使用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官網多瀏覽學習。
使用OpenResty做策略反向代理
睿江雲官網鏈接:http://www.eflycloud.com/#register?salesID=6DGNUTUAV

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章