OpenResty實現(xiàn)http層的nginx流量劫持

介紹

OpenResty ? 是一個基于 Nginx 與 Lua 的高性能 Web 平臺堤框,其內(nèi)部集成了大量精良的 Lua 庫胰锌、第三方模塊以及大多數(shù)的依賴項藐窄。用于方便地搭建能夠處理超高并發(fā)荆忍、擴展性極高的動態(tài) Web 應(yīng)用刹枉、Web 服務(wù)和動態(tài)網(wǎng)關(guān)。

OpenResty 通過匯聚各種設(shè)計精良的 Nginx 模塊(主要由 OpenResty 團隊自主開發(fā))棺亭,從而將 Nginx 有效地變成一個強大的通用 Web 應(yīng)用平臺镶摘。這樣岳守,Web 開發(fā)人員和系統(tǒng)工程師可以使用 Lua 腳本語言調(diào)動 Nginx 支持的各種 C 以及 Lua 模塊湿痢,快速構(gòu)造出足以勝任 10K 乃至 1000K 以上單機并發(fā)連接的高性能 Web 應(yīng)用系統(tǒng)譬重。

OpenResty 的目標(biāo)是讓你的Web服務(wù)直接跑在 Nginx 服務(wù)內(nèi)部,充分利用 Nginx 的非阻塞 I/O 模型消恍,不僅僅對 HTTP 客戶端請求,甚至于對遠(yuǎn)程后端諸如 MySQL狠怨、PostgreSQL佣赖、Memcached 以及 Redis 等都進行一致的高性能響應(yīng)

特點

nginx衍生版本憎蛤,支持多組件支持,純C編寫

解決網(wǎng)絡(luò)阻塞萎胰、跨平臺調(diào)用

支持mysql棚辽、redis連接池應(yīng)用

并發(fā)網(wǎng)絡(luò)請求數(shù)據(jù)處理

根據(jù)需求自身服務(wù)架構(gòu)定制自身需求屈藐,擴展lua組件開發(fā)

擴展組件安裝,由于后續(xù)編譯openresy需要用相關(guān)模塊联逻,不然會出現(xiàn)編譯失敗的問題,根據(jù)需要自行安裝:

libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl build-essential? gcc? openssl

安裝lua擴展組件,調(diào)用后端服務(wù)會用到lua模塊:

curl -R -O http://www.lua.org/ftp/lua-5.1.0.tar.gz

tar zxf lua-5.3.0.tar.gz

cd lua-5.3.0

make linux test

make install

這里推薦用5.1,官方的版本也是用5.1做公壤,低版本或高版本可能會引起不必要的編譯問題導(dǎo)致安裝出問題境钟。

luajit安裝:

wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz

tar zxvf LuaJIT-2.0.4.tar.gz

cd LuaJIT-2.0.4

make && sudo make install

重點說明下:lua和luajit都是openresry需要編譯運行l(wèi)ua環(huán)境的重要組件慨削,缺一不可套媚,后續(xù)會在配置nginx.conf中用到此模塊玫芦,所以需要保證這兩個模塊正常安裝上桥帆。nginx編譯:

由于利用openresry需要用到ngx_devel_kit和lua-nginx-module的相關(guān)模塊,此模塊會在加載nginx同時load進去叶骨,所以需要自行下載安裝重新編譯:

wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz

wget? https://github.com/openresty/lua-nginx-module/archive/v0.10.7.tar.gz

下載完成以后忽刽,找到一個需要放置的目錄的夺欲,我的目錄在:/usr/local下.

由于上面的是nginx的擴展lua支持的組件伞剑,需要重新編譯nginx纸泄,可以根據(jù)需要重新編譯nginx.

nginx -V查看nginx的擴展模塊,沒有的話就把這兩個編譯進去腰素,加到擴展模塊中聘裁,運行下面的命令:

./configure --prefix=/opt/openresty/nginx \? ? #nginx的安裝路徑

--add-module=/path/to/ngx_devel_kit \? #ngx_devel_kit 的源碼路徑

--add-module=/path/to/lua-nginx-module? #nginx_lua_module 的源碼路徑

安裝oepnresty:

wget https://openresty.org/download/openresty-1.11.2.1.tar.gz

tar -xzvf openresty-1.11.2.1.tar.gz

cd openresty-1.11.2.1.tar.gz

./configure --prefix=/opt/openresty \ ###指定安裝openrestry的路徑

--with-luajit \ ##安裝的同事指定luajit擴展

--without-http_redis2_module \ 默認(rèn)沒有開啟http_redis服務(wù)

--with-http_iconv_module \ #開啟http_iconv組件服務(wù)

--with-http_postgres_module #開啟post接受數(shù)據(jù)服務(wù)

此時openrestry安裝完成,重啟openrestry對應(yīng)的nginx服務(wù):

/opt/openresty/nginx/sbin/nginx -c /opt/openresty/nginx/conf/nginx.conf

查看nginx進程

ps -aux|grep nginx

為了后期持續(xù)方便啟動(修改lua配置會重復(fù)服務(wù))弓千,建立軟連接:

ln -s /opt/openresty/nginx/sbin/nginx? /usr/sbin/nginx

=============================================================================

nignx擴展詳解

本次主要涉及對nginx的截流說明衡便,通過openrestry服務(wù)復(fù)用nginx改寫req_limit模塊和conn_limit模塊。其中洋访,openresty封裝了luajit插件集成了limit_req和limit_conn的應(yīng)用镣陕,我們可以很方便進行調(diào)用和規(guī)則重寫機制,針對特定的請求做連接請求數(shù)限制和流量限制數(shù)姻政。

兩者的區(qū)別呆抑,針對限流需要用到的組件:

limit_req:通過令牌桶原理來限制 用戶的連接頻率,提供請求的速率限制和調(diào)整的基礎(chǔ)上的“漏桶”的方法汁展。(這個模塊允許你去限制單個地址 指定會話或特殊需要 的請求數(shù) )

conn_limit: 功能是限制一個客戶端的并發(fā)連接數(shù)侈咕。(這個模塊可以限制單個地址 的指定會話 或者特殊情況的并發(fā)連接數(shù)),常用來做限制客戶端并發(fā)連接數(shù)量罐柳。

limit.traffic:提供一個聚合器將多個實例的resty.limit.req或resty.limit.conn類,組合limit_req和conn_limit聯(lián)合使用。

一個是限制并發(fā)連接,一個是限制連接頻率缓苛,功能都能實現(xiàn)截流芥备,在實現(xiàn)和表現(xiàn)方式上略有不同。

關(guān)于,連接和請求這里面有一個比較完整的解釋绊起,可以看下:

http://www.myhack58.com/Article/60/63/2014/50072.htm

應(yīng)用過程中遇到的一個坑实蔽,就是每次nginx加載lua-resty-limit-traffic組件(此服務(wù)包含了req和conn的實現(xiàn))會直接報500錯誤劳殖,經(jīng)過排查知道官方的提供的對limit模塊的加載擴展路徑不正確,需要自行下載此插件或修改路徑:

加載過程中默認(rèn)的是:restry.limit.req,注意防止的路徑:./oprestry/lualib/restry/limit這樣才能加載進去灵妨,不會nginx會報錯述召。

解決nginx加載req 500錯誤的方法:

將下載下來得lua-resty-limit-traffic解壓藤为。

tar -zxvf lua-resty-limit-traffic-xx.tar.gz

mv ./lua-resty-limit-traffic-xx/?/limit/* /opt/openresty/lualib 保持和openresty放在同一目錄窿吩,加載lua框架會用到轧邪。

解決:上述nginx服務(wù)500的錯誤硕糊。

說明:

local limit_req = require "resty.limit.req" 對應(yīng)引用restry中的限流模塊中req服務(wù).對應(yīng)會找 ====》 /opt/openresty/lualib/resty/limit/req.lua

nginx.conf加載對應(yīng)lualib擴展:

lua_package_path "/opt/openresty/lualib/?.lua;;";

lua_package_cpath "/opt/openresty/lualib/ ?.so;;";

加上以后重啟nginx螟蝙,如果沒有報錯驗證加載成功,可以繼續(xù)對當(dāng)前服務(wù)做擴展。

nginx.conf加載截流配置

1.速率限制策略:

2.鎖限制訪問頻率

這里是利用lua的擴展對nginx做的限流配置,此外lua還可以做很多高并發(fā)、阻塞、json應(yīng)用,有興趣的可以自己嘗試體驗下肛捍,可以在實際應(yīng)用中解決在遠(yuǎn)程后端諸如 MySQL缀蹄、PostgreSQL诡延、Memcached 以及 Redis的擴展開發(fā)惹恃,提高系統(tǒng)的并發(fā)量醉锄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛹找,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖播揪,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碾牌,居然都是意外死亡,警方通過查閱死者的電腦和手機傲隶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娶吞,“玉大人,你說我怎么就攤上這事烈钞√盒溃” “怎么了砚作?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵偎巢,是天一觀的道長窍霞。 經(jīng)常有香客問我冷溃,道長答憔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任诗茎,我火速辦了婚禮工坊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敢订。我一直安慰自己王污,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布楚午。 她就那樣靜靜地躺著昭齐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矾柜。 梳的紋絲不亂的頭發(fā)上阱驾,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天就谜,我揣著相機與錄音,去河邊找鬼里覆。 笑死丧荐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喧枷。 我是一名探鬼主播虹统,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼隧甚!你這毒婦竟也來了车荔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤戚扳,失蹤者是張志新(化名)和其女友劉穎忧便,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咖城,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡茬腿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年呼奢,在試婚紗的時候發(fā)現(xiàn)自己被綠了宜雀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡握础,死狀恐怖辐董,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情禀综,我是刑警寧澤简烘,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站定枷,受9級特大地震影響孤澎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜欠窒,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一覆旭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岖妄,春花似錦型将、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至福扬,卻和暖如春腕铸,著一層夾襖步出監(jiān)牢的瞬間惜犀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工狠裹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留向拆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓酪耳,卻偏偏與公主長得像浓恳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碗暗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容