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)
- 測(cè)試OpenResty是否正常
打開瀏覽器,輸入:http://192.168.1.130/luatest?name=openresty 顯示如下效果,說(shuō)明OpenResty正常
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ā)
測(cè)試結(jié)果:
ab -c 10000 -n 100000 127.0.0.1/luatest
注:10000個(gè)并發(fā)测柠,一共請(qǐng)求10萬(wàn)次
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ī)制脖捻,去攔截非法的用戶ipAPP灰度升級(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