OpenResty的優點html
首先咱們選擇使用OpenResty,其是由Nginx核心加不少第三方模塊組成,其最大的亮點是默認集成了Lua開發環境,使得Nginx能夠做爲一個Web Server使用。nginx
藉助於Nginx的事件驅動模型和非阻塞IO,能夠實現高性能的Web應用程序。git
並且OpenResty提供了大量組件如Mysql、Redis、Memcached等等,使在Nginx上開發Web應用更方便更簡單。目前在京東如實時價格、秒殺、動態服務、單品頁、列表頁等都在使用Nginx+Lua架構,其餘公司如淘寶、去哪兒網等。github
四.Nginx和lua的簡介web
1. Nginx:redis
(1) Nginx的優勢sql
輕量級一樣起web 服務比apache佔用更少內存及資源 apache
抗併發nginx 處理請求異步非阻塞而apache 則阻塞型高併發下nginx 能保持低資源低消耗高性能 編程
高度模塊化設計編寫模塊相對簡單 緩存
社區活躍各類高性能模塊出品迅速啊
(2) Nginx爲何性能高,佔用內存少
衆所周知,nginx性能高,而nginx的高性能與其架構是分不開的。在這裏,咱們簡單粗略的介紹一下nginx的架構。
首先,nginx採用的是多多進程模式,好處是什麼呢?首先,對於每一個worker進程來講,獨立的進程,不須要加鎖,因此省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方便不少。其次,採用獨立的進程,可讓互相之間不會影響,一個進程退出後,其它進程還在工做,服務不會中斷,master進程則很快啓動新的worker進程。固然,worker進程的異常退出,確定是程序有bug了,異常退出,會致使當前worker上的全部請求失敗,不過不會影響到全部請求,因此下降風險。
Nginx是採用異步非阻塞的方式去處理請求的,什麼是異步非阻塞呢?其實就是當一個線程調用出現等待的io之類的狀況時,而不是阻塞在這裏,而是去處理別的事情,等io準備好了,而後再去執行,具體的我就不在這裏和你們描述了。
2. lua:
(1) Lua 是一個小巧的腳本語言。做者是巴西人。該語言的設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能
(2) Lua的特色:
Lua腳本能夠很容易的被C/C++代碼調用,也能夠反過來調用C/C++的函數,這使得Lua在應用程序中能夠被普遍應用。不只僅做爲擴展腳本,也能夠做爲普通的配置文件,代替XML,Ini等文件格式,而且更容易理解和維護。
Lua由標準C編寫而成,代碼簡潔優美,幾乎在全部操做系統和平臺上均可以編譯,運行。一個完整的Lua解釋器不過200k,在目前全部腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是做爲嵌入式腳本的最佳選擇。
五.OpenResty的安裝
上面我門對OpenResty進行了簡單的介紹,運行原理的說明,還有Nginx、Lua優勢的介紹,是爲了更好的讓你們理解。讓你們知道用這個的好處,接下來我簡單的介紹一下OpenResty的安裝和搭建一個簡單的限流的例子,這是爲了讓你們明白,除了上面說的好處,它到底可以作什麼。
OpenResty的安裝:
(1) 須要事先安裝一下所需的插件
1
|
yum
install
readline-devel pcre-devel openssl-devel
|
(2) 下載ngx_openresty-1.7.7.2.tar.gz並解壓
1
|
wget http:
//openresty
.org
/download/ngx_openresty-1
.7.7.2.
tar
.gz
|
(3) 安裝LuaJIT
1
2
3
|
cd
bundle
/LuaJIT-2
.1-20150120/
make
clean &&
make
&&
make
install
ln
-sf luajit-2.1.0-alpha
/usr/local/bin/luajit
|
(4) 下載ngx_cache_purge模塊,該模塊用於清理nginx緩存
1
|
wget https:
//github
.com
/FRiCKLE/ngx_cache_purge/archive/2
.3.
tar
.gz
|
(5) 下載nginx_upstream_check_module模塊,該模塊用於ustream健康檢查
1
|
wget https:
//github
.com
/yaoweibin/nginx_upstream_check_module/archive/v0
.3.0.
tar
.gz
|
(6) 安裝ngx_openresty
1
2
3
4
5
6
7
8
9
|
cd
/usr/servers/ngx_openresty-1
.7.7.2
.
/configure
--prefix=
/usr/servers
--with-http_realip_module
--with-pcre
--with-luajit
--add-module=.
/bundle/ngx_cache_purge-2
.3/
--add-module=.
/bundle/nginx_upstream_check_module-0
.3.0/ -j2
make
&&
make
install
|
(7) 到/usr/servers目錄下,會發現多出來了以下目錄,說明安裝成功
(8) 啓動nginx:/usr/servers/nginx/sbin/nginx(其實咱們能夠配置好系統的環境變量,配置好後就能夠直接數據nginx命令了)
六.防刷(黑白名單)簡單例子的搭建
1. 首先咱們先能夠在/usr/servers/nginx/conf/ 目錄下建立咱們本身的一個簡單的lua文件,就叫作example.lua好了。
輸入以下命令,咱們就能夠建立一個example.conf文件,或者咱們能夠cp nginx.conf example.conf 或者mkdir example.conf
2. 接下來咱們須要編輯nginx.conf這個啓動配置的文件了
ok,咱們進入到編輯界面,接下來咱們須要將咱們的example.conf文件給引入進來,在nginx.conf的http體裏添加一下命令:include example.conf
nginx.conf 的具體內容以下:
其中你們能夠看到用紅線框框的是本身項目文件的引入和lua模塊的引入。
3. 接下來咱們能夠在example.conf文件中寫咱們的邏輯實現了
4. 咱們能夠看到,在example.conf中的server裏面配置多個location,而location中嵌入了content_by_lua_file /usr/example/lua/redis_black_limit.lua,從這能夠看出在content階段嵌入了lua腳本,進行了內容的響應,在這裏,咱們進去看看相應的代碼是如何來處理的:
這是一個防刷的demo,從中咱們能夠看出,我是更具ip,從redis裏面取值,而後經過請求ip的匹配,來作到防刷的功能,除此以外,這裏有一個語句,咱們的注意到,那就是require,這就至關於咱們的類加載器,class.forname,從而作到加載進來lua的模塊。
5. 除此以外,還簡單的作了一個設置黑名單和取消黑名單的功能,用來充當咱們之後的管理中心,具體邏輯寫在set_black.lua和cancel.lua中,而後在lua.conf中配置好url,具體以下圖所示:
在lua.conf中server體里加入一下代碼:
接下來咱們須要寫set_black.lua和cancel.lua文件,文件內容以下:
1
2
3
4
5
6
7
8
9
10
11
12
|
v
set_black.lua:
local
redis =require
"resty.redis"
local
cache =redis.new()
cache:set_timeout(6000)
local
ok,err=cache.connect(cache,
'192.168.150.61'
,6379)
if
not ok
then
ngx.say(
"failed to connect:"
,err)
return
end
local
ip = ngx.var.remote_addr
cache:
set
(
"user:"
..ip..
":block"
,1)
ngx.say(
"user:"
..ip..
":block"
..
"設置黑名單成功"
)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
v
cancel_black.lua:
local
redis =require
"resty.redis"
local
cache =redis.new()
cache:set_timeout(6000)
local
ok,err=cache.connect(cache,
'192.168.150.61'
,6379)
if
not ok
then
ngx.say(
"failed to connect:"
,err)
return
end
local
ip = ngx.var.remote_addr
cache:expire(
"user:"
..ip..
":block"
,0)
ngx.say(
"user:"
..ip..
":block"
..
"移除黑名單"
)
|
7. 效果
作好了以上配置,咱們能夠開始先設置好黑名單,而後訪問請求,返回的結果是被黑名單了,而後再取消黑名單,再訪問請求,顯示訪問成功。
其餘例子:https://www.cnblogs.com/digdeep/p/4859575.html