OpenResty(Nginx+Lua)高並發最佳實踐
分類專欄: OpenResty 文章標簽: OpenResty 高並發 Lua nginx執行lua
版權
文章目錄
OpenResty簡介
Nginx優點
Lua基礎學習
環境搭建
window下環境搭建
Linux(CentOS 7)下環境搭建
linux下ab性能測試
總結
優點
缺點
可適用的場景
OpenResty簡介
以下內容來源與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 等都進行一致的高性能響應
Nginx優點
可參考以下文章
https://blog.csdn.net/nangeali/article/details/60143560
Lua基礎學習
可參考菜鳥教程
環境搭建
window下環境搭建
資源下載
本人電腦64位操作系統,這里下載windows 32位的版本,后續有他用
點擊下載32位版
64位版下載
解壓壓縮包
創建lua目錄源文件目錄,用於寫測試腳本
進入lualib目錄,創建testcode目錄
編寫測試lua腳本
在testcode目錄下創建testlua.lua,並編寫以下腳本信息
--用於接收前端數據的對象
local args=nil
--獲取前端的請求方式 並獲取傳遞的參數
local request_method = ngx.var.request_method
--判斷是get請求還是post請求並分別拿出相應的數據
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()
--兼容請求使用post請求,但是傳參以get方式傳造成的無法獲取到數據的bug
if (args == nil or args.data == null) then
args = ngx.req.get_uri_args()
end
end
--獲取前端傳遞的name值
local name = args.name
--響應前端
ngx.say("hello:"..name)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
編輯nginx配置
按以下目錄編輯對應配置文件
在80的server中添加以下配置:
location /luatest
{
default_type text/html;
#這里的lua文件的路徑為絕對路徑,請根據自己安裝的實際路徑填寫
#記得斜杠是/這個。從window中拷貝出來的是\這樣,這樣是有問題的,務必注意
content_by_lua_file F:/DATA/software/other/openresty-1.13.6.2-win32/lualib/testcode/testlua.lua;
}
1
2
3
4
5
6
7
啟動服務openresty的Nginx服務
進入cmd,並進入到openresty對應的目錄
使用nginx -t 檢測nginx的配置是否正確
啟動nginx服務
測試nginx是否正常
打開瀏覽器,輸入:http://127.0.0.1/ ,得到以下界面說明Nginx配置正常且已經正常運行
測試OpenResty
打開瀏覽器,輸入:http://127.0.0.1/luatest?name=openresty
到這里,window下的OpenResty環境即搭建完成
Linux(CentOS 7)下環境搭建
更多linux版本下的源碼安裝,請參考官網
你可以在你的 CentOS 系統中添加 openresty 倉庫,這樣就可以便於未來安裝或更新我們的軟件包(通過 yum update 命令)。
運行下面的命令就可以添加openresty 的倉庫:
sudo yum install yum-utils
sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
1
2
然后就可以像下面這樣安裝軟件包,比如 openresty:
sudo yum install openresty
1
如果你想安裝命令行工具 resty,那么可以像下面這樣安裝 openresty-resty 包:
sudo yum install openresty-resty
1
命令行工具 opm 在 openresty-opm 包里,而 restydoc 工具在 openresty-doc 包里頭。
列出所有 openresty 倉庫里頭的軟件包:
sudo yum --disablerepo="*" --enablerepo="openresty" list available
1
添加lua的腳本目錄
cd /usr/local/openresty/lualib/
mkdir testcode
cd testcode
創建測試lua腳本
cd /usr/local/openresty/lualib/testcode
vim testlua.lua
添加以下腳本內容
--用於接收前端數據的對象
local args=nil
--獲取前端的請求方式 並獲取傳遞的參數
local request_method = ngx.var.request_method
--判斷是get請求還是post請求並分別拿出相應的數據
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()
--兼容請求使用post請求,但是傳參以get方式傳造成的無法獲取到數據的bug
if (args == nil or args.data == null) then
args = ngx.req.get_uri_args()
end
end
--獲取前端傳遞的name值
local name = args.name
--響應前端
ngx.say("linux hello:"..name)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
保存:wq!
配置ngnix關聯lua文件
cd /usr/local/openresty/nginx/conf/
vi nginx.conf
在80的server中添加以下配置信息
location /luatest
{
default_type text/html;
#這里的lua文件的路徑為絕對路徑,請根據自己安裝的實際路徑填寫
#記得斜杠是/這個。
content_by_lua_file /usr/local/openresty/lualib/testcode/testlua.lua;
}
1
2
3
4
5
6
7
啟動nginx服務
cd /usr/local/openresty/nginx
sbin/nginx
測試nginx是否正常
打開瀏覽器,輸入linux的ip地址,如:http://192.168.1.130/ 顯示如下效果,說明nginx已經正常啟動
測試OpenResty是否正常
打開瀏覽器,輸入:http://192.168.1.130/luatest?name=openresty 顯示如下效果,說明OpenResty正常
linux下ab性能測試
linux服務器環境說明
測試使用的是window下安裝的VM虛擬機,linux的硬件分配為1核 700兆內存
linux下ab工具安裝
yum -y install httpd-tools
查看ab版本
ab -v
壓力測試
1W並發
ab -c 10000 -n 100000 127.0.0.1/luatest
注:10000個並發,一共請求10萬次
測試結果:
1.5W並發
ab -c 15000 -n 100000 127.0.0.1/luatest
2W並發
ab -c 20000 -n 100000 127.0.0.1/luatest
總結
優點
高並發
根據以上的測試來看,一台1核700兆的linux虛擬機即可跑出2W的並發,足以說明OpenResty處理高並發的能力,由於ab工具的限制,只能測試上限2W的並發,因此,這里也只做到了2W的測試。
熱更新
Lua屬於腳本語言,編譯之后即可運行;Nginx具備優雅重啟的功能;因此,線上業務如果出現問題需要及時修復的,更新修改Lua腳本之后,重啟Nginx即可完成更新發布;如果沒有配置Lua緩存功能的話,只要更新Lua腳本即可更新修復線上問題,不重啟Nginx也可以。
缺點
不適合處理復雜的業務邏輯
由於功能性的東西主要使用Lua進行開發,受Lua語言特性的影響,不太適合做業務比較復雜的功能。
互聯網上資料比較少
互聯網上可以找的資料比較少;不過,本身Lua的學習過程不是特別的復雜,所以,這基本不會成為你學習它的障礙
可適用的場景
高訪問下的應用及官網的主頁
如商城,咨詢類的應用首頁,會存在大量的請求,由於涉及到的內容比較多;所以可是私用預載入的形式,將主頁的數據放置在redis中;使用OpenResty+redis實現首頁,官網主頁的高並發加載
商城類的秒殺功能
秒殺功能會存在短時間的請求洪峰,如果處理不當可能會造成down機的風險,可以結合OpenResty+redis實現秒殺的功能
ip限流
互聯網系統可能存在非法用戶惡意暴力請求,導致正常的用戶無法使用,可以通過OpenResty+redis實現ip的白名單機制,去攔截非法的用戶ip
APP灰度升級發布
可以根據系統的數據及條件實現APP的灰度升級測試