用openresty開發Nginx插件

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

相關文章
相關標籤/搜索