<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Nginx配置Lua模塊

          共 3631字,需瀏覽 8分鐘

           ·

          2021-06-14 11:48

          前言
          Nginx與Lua編寫腳本的基本構(gòu)建塊是指令。指令用于指定何時運行用戶Lua代碼以及如何使用結(jié)果。下面是顯示指令執(zhí)行順序的圖。

          原理:
              ngx_lua將Lua嵌入Nginx,可以讓Nginx執(zhí)行Lua腳本,并且高并發(fā)、非阻塞的處理各種請求。Lua內(nèi)建協(xié)程,這樣就可以很好的將異步回調(diào)轉(zhuǎn)換成順序調(diào)用的形式。
              ngx_lua在Lua中進行的IO操作都會委托給Nginx的事件模型,從而實現(xiàn)非阻塞調(diào)用。開發(fā)者可以采用串行的方式編寫程序,ngx_lua會自動的在進行阻塞的IO操作時中斷,保存上下文;然后將IO操作委托給Nginx事件處理機制,在IO操作完成后,ngx_lua會恢復上下文,程序繼續(xù)執(zhí)行,這些操作都是對用戶程序透明的。
               每個NginxWorker進程持有一個Lua解釋器或者LuaJIT實例,被這個Worker處理的所有請求共享這個實例。每個請求的Context會被Lua輕量級的協(xié)程分割,從而保證各個請求是獨立的。
              ngx_lua采用“one-coroutine-per-request”的處理模型,對于每個用戶請求,ngx_lua會喚醒一個協(xié)程用于執(zhí)行用戶代碼處理請求,當請求處理完成這個協(xié)程會被銷毀。每個協(xié)程都有一個獨立的全局環(huán)境(變量空間),繼承于全局共享的、只讀的“comman data”。
               所以,被用戶代碼注入全局空間的任何變量都不會影響其他請求的處理,并且這些變量在請求處理完成后會被釋放,這樣就保證所有的用戶代碼都運行在一個“sandbox”(沙箱),這個沙箱與請求具有相同的生命周期。
               得益于Lua協(xié)程的支持,ngx_lua在處理10000個并發(fā)請求時只需要很少的內(nèi)存。根據(jù)測試,ngx_lua處理每個請求只需要2KB的內(nèi)存,如果使用LuaJIT則會更少。所以ngx_lua非常適合用于實現(xiàn)可擴展的、高并發(fā)的服務。


          1. 安裝解壓lua
            #安裝至/usr/local

          wget http://luajit.org/download/LuaJIT-2.0.5.tar.gztar -zxvf LuaJIT-2.0.5.tar.gz 



          2.進入該目錄執(zhí)行安裝命令
               

          cd LuaJIT-2.0.5make && make install PREFIX=/usr/local/LuaJIT



          3. /etc/profile 文件中加入環(huán)境變量
                  #vi /etc/profile 在最后面加入下面兩行配置

                  

          export LUAJIT_LIB=/usr/local/LuaJIT/libexport LUAJIT_INC=/usr/local/LuaJIT

          #保存執(zhí)行命令

          source /etc/profile

          #路徑是上面luajit實際安裝路徑,路徑錯誤安裝nginxlua模塊時會報錯找不到luajit
          # source /etc/profile 立刻生效,如果ngixn安裝的時候不生效需要重啟服務

          4.下載ngx_devel_kit模塊

           

          wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gztar -zxvf v0.3.0.tar.gz

          #NDKnginx development kit)模塊是一個拓展nginx服務器核心功能的模塊,第三方模塊開發(fā)
          #可以基于它來快速實現(xiàn)。 NDK提供函數(shù)和宏處理一些基本任務,減輕第三方模塊開發(fā)的代碼
          #量。


          5.下載lua-nginx-module模塊

          wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gztar -zxvf v0.10.9rc7.tar.gz

          #lua-nginx-module 模塊使nginx中能直接運行lua




          6.再次編譯nginx
           #增加這兩個模塊

          --add-module=/usr/local/LuaJIT-2.0.5/lua-nginx-module-0.10.9rc7--add-module=/usr/local/LuaJIT-2.0.5/ngx_devel_kit-0.3.0


          通過nginx -V查看之前安裝的信息


          切換到nginx安裝目錄下執(zhí)行編譯添加需要安裝的模塊

          ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --add-module=/usr/local/LuaJIT-2.0.5/lua-nginx-module-0.10.9rc7 --add-module=/usr/local/LuaJIT-2.0.5/ngx_devel_kit-0.3.0 --with-stream 

          如果執(zhí)行出現(xiàn)以下錯誤

          解決辦法:

          yum install lua-devel

          執(zhí)行make && make install安裝

          make && make install


          7.安裝完成后再次執(zhí)行查看是否安裝成功

          nginx -V

          如果出現(xiàn)以下錯誤:

          一般是由于編譯時沒有生成動態(tài)鏈接庫,只能手動鏈接
          #查找安裝的libluajit-5.1.so.2 

          find / -name  libluajit-5.1.so.2

          cat /etc/ld.so.conf#""里面的路徑即時上圖動態(tài)鏈接庫的路徑echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.confldconfig

          如果沒有出錯,則如下




          8. nginx配置文件進行l(wèi)ua的實際使用配置



          在對應攔截請求處,新增驗證

          access_by_lua_block {        local argToken = ngx.var.arg_token;      local headerToken = ngx.var.http_token;      --先驗證請求參數(shù)中是否含有token      if argToken ~= nil then        if argToken ~= "eyJ0eXAiOicYMJFOlA3qpn0vXjXJD0XWDQ" then           ngx.status = ngx.HTTP_FORBIDDEN           ngx.say("Token失效")           ngx.exit(ngx.HTTP_FORBIDDEN)        end      --如果參數(shù)中沒有,驗證請求頭里面是否含有      elseif headerToken ~= nil then        if headerToken ~= "eyJ0eXAiOicYMJFOlA3qpn0vXjXJD0XWDQ" then          ngx.status = ngx.HTTP_FORBIDDEN           ngx.say("Token失效")          ngx.exit(ngx.HTTP_FORBIDDEN)        end      else        print("都沒有");        ngx.status = ngx.HTTP_FORBIDDEN        ngx.say("Token不能為空")        ngx.exit(ngx.HTTP_FORBIDDEN)
          end }


           



          重啟nginx使得配置文件生效,再去訪問頁面





          就會發(fā)現(xiàn)如果不攜帶token訪問頁面是訪問不了的
          攜帶token才可訪問


          瀏覽 87
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  又污又黄的网站 | 粗暴大黑鸡巴视频欧美 | 日本极品无码巨乳在线播放视频 | 日韩操逼电影 | 北条麻妃与黑人 |