0x7OpenResty系列OpenResty最佳案例| 第4篇:OpenResty常見的API

      網友投稿 1441 2022-05-30

      獲取請求參數

      vim /usr/example/example.conf

      location?/lua_var?{

      default_type?'text/plain';

      content_by_lua_block?{

      ngx.say(ngx.var.arg_a)

      }

      }

      重新加載nginx配置文件:nginx -s reload

      在瀏覽器***問http://116.196.177.123/lua_var?a=323,瀏覽器顯示:

      323

      在上述代碼中,涉及到了2個api,一是ngx.say(直接返回請求結果);二是ngx.var,它是獲取請求的參數,例如本示例上的?a = 323,獲取之后,直接輸出為請求結果。

      獲取請求類型

      vim /usr/example/example.conf

      location?/lua_request{

      default_type?'text/html';

      lua_code_cache?off;

      content_by_lua_file??/usr/example/lua/lua_request.lua;

      }

      vim /usr/example/lua/lua_request.lua,添加一下代碼:

      local?arg?=?ngx.req.get_uri_args()

      for?k,v?in?pairs(arg)?do

      ngx.say("[GET?]?key:",?k,?"?v:",?v)

      end

      ngx.req.read_body()?--?解析?body?參數之前一定要先讀取?body

      local?arg?=?ngx.req.get_post_args()

      for?k,v?in?pairs(arg)?do

      ngx.say("[POST]?key:",?k,?"?v:",?v)

      end

      在上述例子中有以下的API:

      ·????? ngx.req.get_uri_args獲取在uri上的get類型參數,返回的是一個表類型的數據結構。

      ·????? ngx.req.read_body讀取body,這在解析body之前,一定要先讀取body。

      ·????? ngx.req.get_post_args獲取表單格式的參數,返回結果是一個表類型的數據。

      使用卷曲模擬請求:

      curl'http://116.196.177.123/lua_request?a=323&b=ss'-d'c = 12w&d = 2se3'

      返回的結果:

      [GET?]?key:b?v:ss

      [GET?]?key:a?v:323

      [POST]?key:d?v:2se3

      [POST]?key:c?v:12w

      獲取請求頭

      vim /usr/example/lua/lua_request.lua,在繼承的代碼基礎上,再添加一下代碼:

      local?headers?=?ngx.req.get_headers()

      ngx.say("headers?begin",?"
      ")

      ngx.say("Host?:?",?headers["Host"],?"
      ")

      ngx.say("user-agent?:?",?headers["user-agent"],?"
      ")

      ngx.say("user-agent?:?",?headers.user_agent,?"
      ")

      for?k,v?in?pairs(headers)?do

      if?type(v)?==?"table"?then

      ngx.say(k,?"?:?",?table.concat(v,?","),?"
      ")

      else

      ngx.say(k,?"?:?",?v,?"
      ")

      end

      end

      重新加載nginx -s重新加載

      使用卷曲模擬請求:

      curl'http://116.196.177.123/lua_request?a=323&b=ss'-d'c = 12w&d = 2se3'

      [GET?]?key:b?v:ss

      [GET?]?key:a?v:323

      [POST]?key:d?v:2se3

      [POST]?key:c?v:12w

      headers?begin

      Host?:?116.196.77.157

      user-agent?:?curl/7.53.0

      user-agent?:?curl/7.53.0

      host?:?116.196.77.157

      content-type?:?application/x-www-form-urlencoded

      accept?:?*/*

      content-length?:?12

      user-agent?:?curl/7.53.0

      獲取HTTP的其他方法

      vim /usr/example/lua/lua_request.lua,在繼承的代碼基礎上,再添加一下代碼:

      ngx.say("ngx.req.http_version?:?",?ngx.req.http_version(),?"
      ")

      --請求方法

      ngx.say("ngx.req.get_method?:?",?ngx.req.get_method(),?"
      ")

      --原始的請求頭內容

      ngx.say("ngx.req.raw_header?:?",??ngx.req.raw_header(),?"
      ")

      --請求的body內容體

      ngx.say("ngx.req.get_body_data()?:?",?ngx.req.get_body_data(),?"
      ")

      ngx.say("
      ")

      重新加載nginx -s重新加載

      使用卷曲模擬請求:

      curl'http://116.196.177.123/lua_request?a=323&b=ss'-d'c = 12w&d = 2se3'

      //....

      ngx.req.http_version?:?1.1

      ngx.req.get_method?:?POST

      ngx.req.raw_header?:?POST?/lua_request?a=323&b=ss?HTTP/1.1

      Host:?116.196.77.157

      User-Agent:?curl/7.53.0

      Accept:?*/*

      Content-Length:?12

      輸出響應

      vim /usr/example/example.conf,添加一個位置,代碼如下:

      location?/lua_response{

      default_type?'text/html';

      lua_code_cache?off;

      content_by_lua_file?/usr/example/lua/lua_response.lua?;

      }

      vim /usr/example/lua/lua_response.lua添加一下代碼:

      ngx.header.a="1"

      ngx.header.b={"a","b"}

      ngx.say("hello","
      ")

      ngx.print("sss")

      return?ngx.exit(200)

      上述代碼中有以下API:

      ·????? ngx.header向響應頭輸出內容

      ·????? ngx.say輸出響應體

      ·????? ngx.print輸出響應體

      ·????? ngx.exit指定http狀態碼退出

      使用curl模擬請求,curl'http://116.196.177.123/lua_response',獲取的響應體如下:

      hello

      sss

      日志輸出

      在配置文件vim /usr/example/example.conf中添加以下代碼:

      location?/lua_log{

      default_type?'text/html';

      lua_code_cache?off;

      content_by_lua_file??/usr/example/lua/lua_log.lua;

      }

      vim /usr/example/lua/lua_log.lua,加上以下代碼:

      local?log="i'm?log"

      local?num?=10

      ngx.log(ngx.ERR,?"log",log)

      ngx.log(ngx.INFO,"num:"?,num)

      重新加載配置文件nginx -s重新加載

      卷曲'http://116.196.177.123/lua_log'

      nginx的日志目錄下的error.log文件:

      tail -fn 1000 /usr/servers/nginx/logs/error.log

      可以看到在日志文件中已經輸出了日志,這種日志主要用于記錄和測試。

      日志級別:

      ·????? ngx.STDERR —標準輸出

      ·????? ngx.EMERG —緊急報錯

      ·????? ngx.ALERT —報警

      ·????? ngx.CRIT —嚴重,系統故障,觸發運維中斷系統

      ·????? ngx.ERR —錯誤,業務不可恢復性錯誤

      ·????? ngx.WARN —植入,業務中可忽略錯誤

      ·????? ngx.NOTICE —提醒,業務比較重要信息

      ·????? ngx.INFO —信息,業務不同碎日志信息,包含不同情況判斷等

      ·????? ngx.DEBUG —調試

      內部調用

      vim /usr/example/example.conf添加以下代碼:

      location?/lua_sum{

      #?只允許內部調用

      internal;

      #?這里做了一個求和運算只是一個例子,可以在這里完成一些數據庫、

      #?緩存服務器的操作,達到基礎模塊和業務邏輯分離目的

      content_by_lua_block?{

      local?args?=?ngx.req.get_uri_args()

      ngx.say(tonumber(args.a)?+?tonumber(args.b))

      }

      }

      internal關鍵字,表示只允許內部調用。使用curl模擬請求,請求命令如下:

      $ curl'http://116.196.177.123/lua_sum?a=1&b=2'

      由于該網站位置是一個內部調用的,外部不能返回,最終返回的結果為404,如下:

      404?Not?Found

      404?Not?Found


      openresty/1.11.2.4

      vim /usr/example/example.conf添加以下代碼:

      location?=?/lua_sum_test?{

      content_by_lua_block?{

      local?res?=?ngx.location.capture("/lua_sum",?{args={a=3,?b=8}})

      ngx.say("status:",?res.status,?"?response:",?res.body)

      }

      }

      上述的代碼通過ngx.location.capture去調用內部的位置,并獲得返回結果,最終將結果輸出,采用卷曲模擬請求:

      $ curl'http://116.196.177.123/lua_sum_test'

      返回結果如下:

      status:200?response:11

      重定向

      vim / usr

      location?/lua_redirect{

      default_type?'text/html';

      content_by_lua_file??/usr/example/lua/lua_redirect.lua;

      }

      ngx.redirect("http://www.fangzhipeng.com",?302)

      http://116.196.177.123/lua_redirect

      共享內存

      vim /usr/servers/nginx/cong/nginx.conf

      在HTTP模塊加上以下:

      lua_shared_dict?shared_data?1m;

      location?/lua_shared_dict{

      default_type?'text/html';

      content_by_lua_file?/usr/example/lua/lua_shared_dict.lua;

      }

      local?shared_data?=?ngx.shared.shared_data

      local?i?=?shared_data:get("i")

      if?not?i?then

      i?=?1

      shared_data:set("i",i)

      end

      i?=?shared_data:incr("i",1)

      ngx.say("i:",i)

      多次訪問http://116.196.177.123/lua_shared_dict,瀏覽器打印:

      i:1

      i:2

      i:3

      i:4

      i:5

      OpenResty執行階段的概念

      以下內容來自于《 openresty最佳實踐》

      如上圖所示,openresty的執行階段分為

      這樣我們就可以根據我們的需要,在不同的階段直接完成大部分典型處理了。

      ·????? set_by_lua *:流程分支處理判斷變量初始化

      ·????? rewrite_by_lua *:轉發,重定向,緩存等功能(例如特定請求代理到外網)

      ·????? access_by_lua *:IP準入,接口權限等情況集中處理(例如iptable完成簡單防火墻)

      ·????? content_by_lua *:內容生成

      ·????? header_filter_by_lua *:響應頭部過濾處理(例如添加頭部信息)

      0x7OpenResty系列:Openresty最佳案例| 第4篇:OpenResty常見的API

      ·????? body_filter_by_lua *:響應體過濾處理(例如完成應答內容統一成大寫)

      執行階段概念:

      ·????? log_by_lua *:會話完成后本地初始完成日志記錄(日志可以記錄在本地,還可以同步到其他機器)

      實際上我們只使用其中一個階段

      ·????? content_by_lua *,也可以完成所有的處理。但由此,變成我們的代碼比較臃腫,越到后期越發難以維護。把我們的邏輯放在不同階段,分工明確,代解碼獨立,后期發力就可以很多有意思的玩法。

      ·

      方志朋簡介:SpringCloud中國社區聯合創始人,博客訪問量突破一千萬,愛好開源,熱愛分享,活躍于各大社區,保持著非常強的學習驅動力,終身學習踐行者,終身學習受益者。目前就職于國內某家知名互聯網保險公司,擔任DEVOPS工程師,對微服務領域和持續集成領域研究較深,精通微服務框架SpringCloud

      API Nginx

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:《機器學習:算法視角(原書第2版)》 —3.3 感知器
      下一篇:萬維網誕生30周年:看HTTP和HTTPS的起源發展
      相關文章
      亚洲avav天堂av在线网爱情| 亚洲国产婷婷六月丁香| 亚洲男人天堂2017| 亚洲乳大丰满中文字幕| 久久亚洲高清综合| 亚洲第一区精品观看| 国产精品亚洲一区二区在线观看| 在线亚洲高清揄拍自拍一品区| 亚洲日本国产综合高清| 亚洲人成电影网站久久| 亚洲一线产品二线产品| 亚洲综合精品第一页| 色天使亚洲综合在线观看| 亚洲色欲色欲www| 中文文字幕文字幕亚洲色| 亚洲av无码一区二区三区观看| 亚洲国产日产无码精品| 亚洲人成网站在线观看播放动漫 | 亚洲VA综合VA国产产VA中| 偷自拍亚洲视频在线观看| 亚洲国产精品视频| 久久久久亚洲AV成人网人人网站| 久久亚洲色一区二区三区| 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲av片在线观看| 午夜亚洲国产精品福利| 亚洲人午夜射精精品日韩| 中文字幕亚洲一区| 亚洲春色在线视频| 久久久久亚洲AV无码麻豆| 亚洲图片校园春色| 亚洲中文无码永久免费| MM1313亚洲精品无码久久| 亚洲欧洲中文日韩av乱码| 亚洲色成人中文字幕网站| 香蕉蕉亚亚洲aav综合| 亚洲欧洲在线播放| 亚洲中文字幕无码爆乳app| 国产青草亚洲香蕉精品久久| 久久亚洲国产精品123区| 亚洲成人动漫在线|