介紹
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ā)量醉锄。