【NGINX入門】12.OpenResty(Nginx+Lua)高并發(fā)最佳實(shí)踐

1. 摘要

本文介紹以下內(nèi)容:
OpenResty簡(jiǎn)介
Nginx優(yōu)點(diǎn)
Lua基礎(chǔ)學(xué)習(xí)
環(huán)境搭建
window下環(huán)境搭建
Linux(CentOS 7)下環(huán)境搭建
linux下ab性能測(cè)試
總結(jié)
優(yōu)點(diǎn)
缺點(diǎn)
可適用的場(chǎng)景

1. OpenResty簡(jiǎn)介

以下內(nèi)容來(lái)源于OpenResty官網(wǎng)伊履,更多信息可進(jìn)入官網(wǎng)了解送膳。
OpenResty 是一個(gè)基于 Nginx 與 Lua 的高性能 Web 平臺(tái)镜盯,其內(nèi)部集成了大量精良的 Lua 庫(kù)睛低、第三方模塊以及大多數(shù)的依賴項(xiàng)趁窃。用于方便地搭建能夠處理超高并發(fā)粱坤、擴(kuò)展性極高的動(dòng)態(tài) Web 應(yīng)用座慰、Web 服務(wù)和動(dòng)態(tài)網(wǎng)關(guān)坝疼。

OpenResty 通過(guò)匯聚各種設(shè)計(jì)精良的 Nginx 模塊(主要由 OpenResty 團(tuán)隊(duì)自主開發(fā)),從而將 Nginx 有效地變成一個(gè)強(qiáng)大的通用 Web 應(yīng)用平臺(tái)闸英。這樣锯岖,Web 開發(fā)人員和系統(tǒng)工程師可以使用 Lua 腳本語(yǔ)言調(diào)動(dòng) Nginx 支持的各種 C 以及 Lua 模塊,快速構(gòu)造出足以勝任 10K 乃至 1000K 以上單機(jī)并發(fā)連接的高性能 Web 應(yīng)用系統(tǒng)甫何。

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

2. Nginx優(yōu)點(diǎn)

可參考以下文章
https://blog.csdn.net/nangeali/article/details/60143560

3. Lua基礎(chǔ)學(xué)習(xí)

可參考菜鳥教程

4. 環(huán)境搭建

4.1 Linux(CentOS 7)下環(huán)境搭建

更多l(xiāng)inux版本下的源碼安裝巍耗,請(qǐng)參考官網(wǎng)
你可以在你的 CentOS 系統(tǒng)中添加 openresty 倉(cāng)庫(kù)秋麸,這樣就可以便于未來(lái)安裝或更新我們的軟件包(通過(guò) yum update 命令)。

  • 運(yùn)行下面的命令就可以添加openresty 的倉(cāng)庫(kù):

    sudo yum install yum-utils
    sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
    
    
  • 然后就可以像下面這樣安裝軟件包芍锦,比如 openresty:

    sudo yum install openresty
    
    
  • 如果你想安裝命令行工具 resty竹勉,那么可以像下面這樣安裝 openresty-resty 包:

    sudo yum install openresty-resty
    
    
  • 命令行工具 opm 在 openresty-opm 包里,而 restydoc 工具在 openresty-doc 包里頭娄琉。
    列出所有 openresty 倉(cāng)庫(kù)里頭的軟件包:

    sudo yum --disablerepo="*" --enablerepo="openresty" list available
    
    
  • 添加lua的腳本目錄
    cd /usr/local/openresty/lualib/
    mkdir testcode
    cd testcode

  • 創(chuàng)建測(cè)試lua腳本
    cd /usr/local/openresty/lualib/testcode
    vim testlua.lua
    添加以下腳本內(nèi)容

    --用于接收前端數(shù)據(jù)的對(duì)象
    local args=nil
    --獲取前端的請(qǐng)求方式 并獲取傳遞的參數(shù)   
    local request_method = ngx.var.request_method
    --判斷是get請(qǐng)求還是post請(qǐng)求并分別拿出相應(yīng)的數(shù)據(jù)
    if"GET" == request_method then
            args = ngx.req.get_uri_args()
    elseif "POST" == request_method then
            ngx.req.read_body()
            args = ngx.req.get_post_args()
            --兼容請(qǐng)求使用post請(qǐng)求次乓,但是傳參以get方式傳造成的無(wú)法獲取到數(shù)據(jù)的bug
            if (args == nil or args.data == null) then
                    args = ngx.req.get_uri_args()
            end
    end
    
    --獲取前端傳遞的name值
    local name = args.name
    --響應(yīng)前端
    ngx.say("linux hello:"..name)
    
    

    保存:wq!

  • 配置ngnix關(guān)聯(lián)lua文件
    cd /usr/local/openresty/nginx/conf/
    vi nginx.conf
    在80的server中添加以下配置信息

            location /luatest
            {       
                    default_type text/html;
                    #這里的lua文件的路徑為絕對(duì)路徑吓歇,請(qǐng)根據(jù)自己安裝的實(shí)際路徑填寫
                    #記得斜杠是/這個(gè)。
                    content_by_lua_file /usr/local/openresty/lualib/testcode/testlua.lua;
            } 
    
    
  • 啟動(dòng)nginx服務(wù)
    cd /usr/local/openresty/nginx
    sbin/nginx
  • 測(cè)試nginx是否正常
    打開瀏覽器票腰,輸入linux的ip地址,如:http://192.168.1.130/ 顯示如下效果城看,說(shuō)明nginx已經(jīng)正常啟動(dòng)

5. linux下ab性能測(cè)試

  • linux服務(wù)器環(huán)境說(shuō)明
    測(cè)試使用的是window下安裝的VM虛擬機(jī)杏慰,linux的硬件分配為1核 700兆內(nèi)存

  • linux下ab工具安裝
    yum -y install httpd-tools

  • 查看ab版本
    ab -v

  • 壓力測(cè)試

    • 1W并發(fā)
      ab -c 10000 -n 100000 127.0.0.1/luatest
      注:10000個(gè)并發(fā)测柠,一共請(qǐng)求10萬(wàn)次

      測(cè)試結(jié)果:
    • 1.5W并發(fā)

ab -c 15000 -n 100000 127.0.0.1/luatest ![](https://upload-images.jianshu.io/upload_images/1190574-9c081273d111bc91.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 2W并發(fā)
ab -c 20000 -n 100000 127.0.0.1/luatest

6. 總結(jié)

(1) 優(yōu)點(diǎn)
  • 高并發(fā)
    根據(jù)以上的測(cè)試來(lái)看,一臺(tái)1核700兆的linux虛擬機(jī)即可跑出2W的并發(fā)缘滥,足以說(shuō)明OpenResty處理高并發(fā)的能力轰胁,由于ab工具的限制,只能測(cè)試上限2W的并發(fā)朝扼,因此赃阀,這里也只做到了2W的測(cè)試。

  • 熱更新
    Lua屬于腳本語(yǔ)言擎颖,編譯之后即可運(yùn)行榛斯;Nginx具備優(yōu)雅重啟的功能;因此搂捧,線上業(yè)務(wù)如果出現(xiàn)問(wèn)題需要及時(shí)修復(fù)的驮俗,更新修改Lua腳本之后,重啟Nginx即可完成更新發(fā)布允跑;如果沒(méi)有配置Lua緩存功能的話王凑,只要更新Lua腳本即可更新修復(fù)線上問(wèn)題,不重啟Nginx也可以吮蛹。

(2) 缺點(diǎn)
  • 不適合處理復(fù)雜的業(yè)務(wù)邏輯
    由于功能性的東西主要使用Lua進(jìn)行開發(fā)荤崇,受Lua語(yǔ)言特性的影響,不太適合做業(yè)務(wù)比較復(fù)雜的功能潮针。

  • 互聯(lián)網(wǎng)上資料比較少
    互聯(lián)網(wǎng)上可以找的資料比較少;不過(guò)倚喂,本身Lua的學(xué)習(xí)過(guò)程不是特別的復(fù)雜每篷,所以,這基本不會(huì)成為你學(xué)習(xí)它的障礙

7. 可適用的場(chǎng)景

  • 高訪問(wèn)下的應(yīng)用及官網(wǎng)的主頁(yè)
    如商城端圈,咨詢類的應(yīng)用首頁(yè)焦读,會(huì)存在大量的請(qǐng)求,由于涉及到的內(nèi)容比較多舱权;所以可是私用預(yù)載入的形式矗晃,將主頁(yè)的數(shù)據(jù)放置在redis中;使用OpenResty+redis實(shí)現(xiàn)首頁(yè)宴倍,官網(wǎng)主頁(yè)的高并發(fā)加載

  • 商城類的秒殺功能
    秒殺功能會(huì)存在短時(shí)間的請(qǐng)求洪峰张症,如果處理不當(dāng)可能會(huì)造成down機(jī)的風(fēng)險(xiǎn)仓技,可以結(jié)合OpenResty+redis實(shí)現(xiàn)秒殺的功能

  • ip限流
    互聯(lián)網(wǎng)系統(tǒng)可能存在非法用戶惡意暴力請(qǐng)求,導(dǎo)致正常的用戶無(wú)法使用俗他,可以通過(guò)OpenResty+redis實(shí)現(xiàn)ip的白名單機(jī)制脖捻,去攔截非法的用戶ip

  • APP灰度升級(jí)發(fā)布
    可以根據(jù)系統(tǒng)的數(shù)據(jù)及條件實(shí)現(xiàn)APP的灰度升級(jí)測(cè)試.

8.參考

(1)OpenResty(Nginx+Lua)高并發(fā)最佳實(shí)踐
https://blog.csdn.net/lupengfei1009/article/details/86062644

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兆衅,隨后出現(xiàn)的幾起案子地沮,更是在濱河造成了極大的恐慌,老刑警劉巖羡亩,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摩疑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡畏铆,警方通過(guò)查閱死者的電腦和手機(jī)未荒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)及志,“玉大人片排,你說(shuō)我怎么就攤上這事∷俪蓿” “怎么了率寡?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)倚搬。 經(jīng)常有香客問(wèn)我冶共,道長(zhǎng),這世上最難降的妖魔是什么每界? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任捅僵,我火速辦了婚禮,結(jié)果婚禮上眨层,老公的妹妹穿的比我還像新娘庙楚。我一直安慰自己,他們只是感情好趴樱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布馒闷。 她就那樣靜靜地躺著,像睡著了一般叁征。 火紅的嫁衣襯著肌膚如雪纳账。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天捺疼,我揣著相機(jī)與錄音疏虫,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卧秘,可吹牛的內(nèi)容都是我干的呢袱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼斯议,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼产捞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哼御,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤坯临,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后恋昼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體看靠,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年液肌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挟炬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗦哆,死狀恐怖谤祖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情老速,我是刑警寧澤粥喜,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站橘券,受9級(jí)特大地震影響额湘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旁舰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一锋华、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箭窜,春花似錦毯焕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至坊罢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擅耽,已是汗流浹背活孩。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乖仇,地道東北人憾儒。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓询兴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親起趾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诗舰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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