婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Lua和Nginx結合使用的超級指南

Lua和Nginx結合使用的超級指南

熱門標簽:海口智能語音電銷機器人好用嗎 陜西便宜電銷機器人軟件 杞縣地圖標注app 免費門店地圖標注注冊入駐 昆明電話外呼系統好么 外呼系統一天耗費多少流量 艾比利外呼系統 衡水外呼線路解決 電話機器人每天搜索多少次

 Nginx作為API代理

有很多原因說明你為什使用nginx作為API代理。首先因為他是開源的;其次,Nginx有大量的安裝基礎,他背后有一個強大的社區支持,在性能方面也表現的非常出色。對于我們來說,這是顯而易見的,如果開源軟件有相同的解決方案我們為啥還要用那些私有的軟件。

另外一個極大的優勢就是nginx對lua的支持,nginx+lua是一個非常好的組合,它允許使用一個高性能的腳本語言擴展nginx。nginx有很多方法是自帶的,但是使用lua沒有限制的。

原理很簡單。有沒有這樣的情況你更喜歡使用基于nginx的API代理而不是它自帶的方法呢?呵呵,你可以非常簡單的添加。

擴展目標: Sentiment API (可以是任何API)

為了展示nginx和lua的強大之處,我們將使用一個簡單的REST API調用Sentiment,不使用任何一行API源碼(可以直接使用github上的)。

Sentiment API 是一個非常基礎的API,它返回一個有情感價值分析的單詞或者句子。比如,下面的請求(你可以自己試試)

復制代碼 代碼如下:
curl http://api-sentiment.3scale.net/v1/word/fantastic.json

上面的請求將返回包含fantastic情感分析單詞的json串。

復制代碼 代碼如下:
 {"sentiment":4,"word":"fantastic"}

我們有了擴展對象,接下來繼續吧…

分析部分: 擴展Sentiment API

有很多方式你可以擴展Sentiment API(或者你自己的API)。為了符合這篇文章的主題,我們限定了三種場景來展示nginx+lua的強大之處和可擴展性。
1) 想做數據轉換?

想把輸出數據從json轉換為xml格式?或者更好一些,把xml轉換為json。
2) 想更換你的API方法的簽名?

你想把漂亮的 REST形式的url path/v1/word/WORD.json替換為貌似更加 “漂亮的” 簽名方式 parameters/sentiment?action=wordword=WORDversion=v1.

我們不能容忍變成那樣的路徑方式:-)這應該是個反面例子,自從Sentiment API改為RESTful方式,這個例子應該反過來了。
3) 想創建一個新的API方法?

沒問題,你可以自己創建個新的API方法得到你想要的,或者有可能,你可以不接觸任何API源碼來擴展你的API方法。

我們將展示下創建一個Sentiment API的新方法:用來查找在一個句子中最有情感分析價值的單詞。這個方法在Sentiment API沒有提供,但是我們可以通過nginx和lua創建它。

這個案例無論對于用戶還是對于API開發者多有很大的潛能。基本上可以允許你自己在不修改源碼的基礎上定制API,或者,這還有酷斃了的一部分,允許你定制你不能控制的API。想在包含一系列方法的Twitter API上創建自己的方法?當然可以,結果可能是你的應用程序代碼更簡潔了。

這只是使用nginx+lua擴展的三個簡單例子。還有一些其他例子我們只是為了突出使用nginx+lua擴展你的API有多么簡單和強大。

讓我們開始做點實際的東西吧…

使用lua擴展nginx

我們假設你應經對nginx基礎概念有了了解(servers, locations, 等…)

擴展nginx我們必須先提供lua的支持,它不是ngnix的一部分。我們無需擔心因為已經有很多組件編譯進了lua,像:

  •     openresty (在3scale)
  •     tengine

如果你堅持自己安裝 :-) 你可以自己安裝下面的組件:

  •     Lua nginx module
  •     HttpProxy module

事實上,如果你不想用lua而是更喜歡perl,查看下這個頁面look at the CPAN page,這里提供了全部文檔。

基礎部分

整個處理過程是代理請求到真實的API,主要通過下面過程:1)捕獲請求傳遞給API 2)響應請求,接著 3)處理響應。

下面展示了nginx配置文件中的相關配置:

復制代碼 代碼如下:
upstream backend {
  # service name: API ;
  server api-sentiment.3scale.net:80 max_fails=5 fail_timeout=30;
}

server {
  listen 8181;

  location ~ /v1/word/(.*)\.json$ {
    proxy_pass http://backend/v1/word/$1.json ;
  }
}

這里我們只配置了一個路由地址:/v1/word/your-word-goes-here.json。這個路由在Sentiment API上返回一個結果. Nginx 只是負責做一個簡單的傳遞。

你可以啟動你的nginx (監聽本地端口 8181) ,用下面的方式發送一個請求

復制代碼 代碼如下:
curl http://localhost:8181/v1/word/fantastic.json

它將返回一個同樣的json

復制代碼 代碼如下:
{"sentiment":4,"word":"fantastic"}

我們只是給真實的Sentiment API做了個中轉。讓我們帶著興趣繼續吧…

1) 數據轉換
JSON 到 XML

在nginx配置文件添加新的路由,如下:

復制代碼 代碼如下:
upstream backend {
  # service name: API ;
  server api-sentiment.3scale.net:80 max_fails=5 fail_timeout=30;
}

server {
  listen 8181;

  location ~ /v1/word/(.*)\.json$ {
    proxy_pass http://backend/v1/word/$1.json ;
  }

  location ~ /v1/word/(.*)\.xml$ {
    content_by_lua_file /PATH_TO/json_to_xml.lua;
  }
}

我們僅添加了一個新路由:/v1/word/your-word-goes-here.xml。這個路由將把 Sentiment API輸出的json轉換為xml格式。我們沒有做一個傳遞,而是通過調用一個lua文件實現邏輯的(不要擔心,很簡單)。

現在你可以做下面的工作了,

curl http://localhost:8181/v1/word/fantastic.xml

你將獲取到下面信息:

復制代碼 代碼如下:
?xml version="1.0" encoding="UTF-8"?>
response>
  sentiment>4/sentiment>
  word>fantastic/word>
/response>

這里發生了什么?好吧,我們基本上把Sentiment API輸出的json數據轉換成了xml格式!
lua的魔法

轉化json為xml需要一系列的lua libs:

  •     cjson :通過luarocks安裝或者在項目主頁上下載手動安裝。
  •     luaXml :  我們將使用一個補丁版本來使他在nginx下工作,你可以在這里下載補丁版本here

如果你在安裝luaxml時遇到問題,那么可以直接安裝luarocks作為替代方案,把luaxml文件放到openresty里面的lua lib目錄下,查找lua libs默認目錄就是openresty。

當我們訪問xml路由時,nginx將調用lua文件

復制代碼 代碼如下:
local xml = require("LuaXml")
require("os")
local cjson = require "cjson"
 
local path = ngx.var.request:split(" ")[2]
local m = ngx.re.match(path,[=[/([^/]+)\.(json|xml)$]=]) -- match last word
local res = ngx.location.capture("/v1/word/".. m[1] .. ".json" )
local value=cjson.new().decode(res.body)
 
local response = xml.new("response")
 
response.word= xml.new("word")
response.sentiment = xml.new("sentiment")
response.timestamp = xml.new("timestamp")
table.insert(response.word, value.word)
table.insert(response.sentiment, value.sentiment)
table.insert(response.timestamp, os.date())
 
ngx.say('?xml version="1.0" encoding="UTF-8"?>', xml.str(response,0))

這個lua文件做了一個本地json請求,使用下面的配置

復制代碼 代碼如下:
local res = ngx.location.capture("/v1/word/".. m[1] .. ".json" )

它直接請求的真實的Sentiment API,一旦你有了json對象,我們就可以按照規則轉化為xml格式,從

復制代碼 代碼如下:
{"sentiment":4,"word":"fantastic"}

復制代碼 代碼如下:
?xml version="1.0" encoding="UTF-8"?>

response>

  sentiment>4/sentiment>

  word>fantastic/word>

/response>

注意split函數在lua中不存在,但是你可以參照這里 but you can use this one.

現在,這個轉換是個手動過程,我們需要知道json的字段名稱,但是我們也可以采用自動的方式分配json對象名稱為指定的xml標簽。

既然我們已經轉化為xml了,我們想要給輸出的xml添加額外的字段,比如時間戳怎么處理呢?


添加一個時間戳

在lua代碼塊中,你有整個的lua環境變量可以自由使用,因此我們使用os模塊來獲取當前時間。

我們僅需在ngx.say行之前添加下面幾行。

復制代碼 代碼如下:
require("os")
response.timestamp = xml.new("timestamp")
table.insert(bar.timestamp, os.date())

當我們調用/xml時將從api輸出下面結果

復制代碼 代碼如下:
?xml version="1.0" encoding="UTF-8"?>
response>
  sentiment>3/sentiment>
  word>hello/word>
  timestamp>Wed Jan  9 15:34:56 2013/timestamp>
/response>

酷斃了吧?怎么樣,不難吧騷年 :)
XML 到 JSON

為了演示例子我們做一個從xml到json的轉換. 讓我們在nginx配置文件中添加一個新的配置:

復制代碼 代碼如下:
location ~ ^/round-trip/v1/word/(.*).json$ {
  content_by_lua_file /PATH_TO/xml_to_json.lua;
}

xml_to_json.lua如下所示:

復制代碼 代碼如下:
local xml = require("LuaXml")
local cjson = require "cjson"
 
local path = ngx.var.request:split(" ")[2]
local m = ngx.re.match(path,[=[/([^/]+)\.json]=])
local res = ngx.location.capture("/v1/word/".. m[1] .. ".xml")
 
local my_xml = xml.eval(res.body)
 
local sent_val = my_xml:find("sentiment")[1]
local word_val = my_xml:find("word")[1]
local t = {sentiment = sent_val, word = word_val}
local value=cjson.encode(t)
ngx.say(value)

正如你所看到的,我們點擊我們剛剛創建的xml端點路由時,那么,我們將使用LuaXml解析xml并且使用cjson生成合理的json。

注意我們在這里沒有遵循任何規范,轉換xml到json一般情況下是存在一些問題的,因為xml可讀性比json好。一般做轉換時你需要遵循一定的規范,比如BadgerFish 或者 Parker,或者你自己創建的規范。

2) 重寫API方法

使用nginx重寫你的api方法是件微不足道的事,這樣對于開發者開說就更容易使用他們的api了。典型的例子就是舊的扭曲的API,我們想對其美化使得它對REST更加友好。

解決這個問題的一個方式是修改API源碼的路由。然而,很多時候你不想改變源碼,雖然改變源碼也能實現,但是是一種落后的方法。克服那些接觸源碼的擔憂,可以在nginx上添加一層,這樣就不用接觸和重新部署那些奇怪的代碼了 :-)

為了用例子來說明,我們將轉換一個類似于REST的API方法

復制代碼 代碼如下:
/v1/word/WORD.json

對于一些使用查詢參數的更“漂亮的”方式,如下:

復制代碼 代碼如下:
/sentiment?action=wordversion=v1word=WORD

這種“升級”可以有多種方式實現。 對于熟悉nginx的可以簡單的通過重寫規則來解決這個問題。如果你更喜歡使用“sysadmin”方式,你可以按如下方式:

復制代碼 代碼如下:
location ~ /sentiment$ {
    content_by_lua '
      local params = ngx.req.get_query_args()
      if (params.action == "word" and params.version ~= nil) then
        local res= ngx.location.capture("/".. params.version ..
          "/word/" .. params.word .. ".json")
        ngx.say(res.body)
      end
    ';
}

正如上面這樣。現在sentiment API也接受如下舊的API方法:

復制代碼 代碼如下:
curl http://localhost:8181/sentiment?action=wordword=fantasticversion=v1

這將返回預期的JSON對象。

3) 數據聚合

Nginx和lua可以幫助我們完成更為復雜的事情,像根據不同的方法組成一個全新的API方法。

在例子中,我們通過創建一個新的方法擴展了Sentiment API,這個方法返回一個句子中最有情感價值的單詞。

或許使用這樣的方法不值得大談特談:-D但是每次你都希望通過調用一個API完成4個方法調用,或者你可以通過單個任務調用其他3個不同的方法。你可以把你的方法聚集到一個API方法里來供應用程序調用!

讓我們繼續看這個例子,首先我們需要添加一個新的配置,

復制代碼 代碼如下:
location ~ ^/v1/max/(.*).json$ {
  content_by_lua_file /PATH_TO/max.lua;
}

接下來,我們只需要把聚集方法寫到lua腳本里:

復制代碼 代碼如下:
local path = ngx.var.request:split(" ")[2] -- path
local t={}
local cjson = require "cjson"
ngx.log(0, path[2])
local m = ngx.re.match(path,[=[^/v1/max/(.+).json]=])
local words = m[1]:split("+") -- words in the sentence
 
local max = nil
for i,k in pairs(words) do
local res_word = ngx.location.capture("/v1/word/".. k .. ".json" )
local value=cjson.new().decode(res_word.body)
if max == nil or max.sentiment value.sentiment then
max = value
end
end
ngx.say(cjson.new().encode(max))

如你所見,他不能再簡單了。首先,我們獲取到句子,切分單詞,然后對每個單詞調用API請求/v1/word。我們把情感分析價值較高的對象存儲起來。

最終結果很簡單,像下面的請求:

復制代碼 代碼如下:
curl -g http://localhost:8181/v1/max/nginx+and+lua+are+amazing.json

我們獲取到積極情緒最高的單詞,

復制代碼 代碼如下:
{"sentiment":4,"word":"amazing"}

max.lua聚合函數的邏輯可以按照你想要的更加復雜,也可以獲取到任何你的API方法,不管是不是你能控制的API。

能否插件化? 完全可以。 你可以創建任意復雜的插件,然后讓他們在應用程序中保持不可見。

結論

我們提到的這三個例子只是使用nginx和lua做的一個玩具性質的實驗。

在3scale上,我們已經把類似的架構應用于生產環境,像一些高負載環境,沒有什么比這個結果更讓我們高興的了。

我們不斷地發現越來越多的地方可以使用這個特性,像netflix post一篇帖子最近提醒我們減少對APIs的調用次數可以在一些大業務量終端或者有缺陷的設備上取得顯著的性能提升效果。

Nginx + lua 是一個改變常規的技術,雖然它不太常用,但是相信我們的話,一旦你嘗試下你就會被他的強大、靈活和簡單所吸引。

擴展一個API從來沒有這么簡單過。愛過!

您可能感興趣的文章:
  • 安裝Nginx+Lua開發環境
  • nginx中使用lua腳本的方法
  • openresty中使用lua-nginx創建socket實例
  • Nginx+Lua+Redis構建高并發Web應用
  • 使用nginx+lua實現信息訪問量統計
  • linux系統安裝Nginx Lua環境

標簽:泰安 西寧 昌都 營口 海口 南京 臨滄 宿遷

巨人網絡通訊聲明:本文標題《Lua和Nginx結合使用的超級指南》,本文關鍵詞  Lua,和,Nginx,結合,使,用的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua和Nginx結合使用的超級指南》相關的同類信息!
  • 本頁收集關于Lua和Nginx結合使用的超級指南的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品免费国产二区三区| 成人app在线| 成人理论电影网| 久久精品视频网| 毛片av一区二区| 91精品国产全国免费观看| 亚洲大片精品永久免费| 精品视频一区 二区 三区| 亚洲国产精品自拍| 日韩亚洲电影在线| 国产一区二区毛片| 亚洲国产成人私人影院tom| www.在线欧美| 亚洲一区电影777| 欧美一区二区三区爱爱| 国产曰批免费观看久久久| 国产欧美日韩精品一区| 91影院在线免费观看| 婷婷国产v国产偷v亚洲高清| 日韩欧美亚洲国产另类| 成人免费视频国产在线观看| 伊人开心综合网| 欧美一区二区黄色| 成人av综合一区| 天堂在线一区二区| 国产日韩v精品一区二区| 在线影视一区二区三区| 久久99精品久久久久久国产越南| 国产欧美一区二区精品性| 色老头久久综合| 老司机精品视频一区二区三区| 国产日韩欧美精品一区| 欧美三级三级三级爽爽爽| 国产在线精品一区二区| 一区二区欧美精品| 欧美精品一区二| 欧美日韩精品一区视频| 国产a视频精品免费观看| 亚洲国产日产av| 中文字幕第一区二区| 欧美一区日本一区韩国一区| 成人av免费在线| 蜜桃精品视频在线观看| 一卡二卡欧美日韩| 国产精品欧美久久久久一区二区| 日韩一级黄色大片| 欧美优质美女网站| 成人国产亚洲欧美成人综合网 | 99久久国产综合精品女不卡| 日本视频在线一区| 亚洲码国产岛国毛片在线| 国产欧美一区二区精品性| 久久毛片高清国产| 日韩免费高清av| 7777精品伊人久久久大香线蕉| 色综合久久中文综合久久97| 懂色中文一区二区在线播放| 国内精品久久久久影院色| 偷拍与自拍一区| 丝袜国产日韩另类美女| 亚洲3atv精品一区二区三区| 亚洲妇女屁股眼交7| 亚洲永久精品大片| 一区在线中文字幕| 欧美经典一区二区| 国产亚洲精品7777| 国产精品欧美综合在线| 欧美国产精品劲爆| 中文字幕欧美一| 一区二区日韩电影| 日韩精品一卡二卡三卡四卡无卡| 日韩影院精彩在线| 日韩成人一区二区三区在线观看| 午夜精品福利视频网站| 青青草伊人久久| 精品系列免费在线观看| 国产精品99久久久久久似苏梦涵 | 免费人成精品欧美精品| 麻豆成人免费电影| 韩国av一区二区三区| 成人性视频免费网站| 色哟哟日韩精品| 日韩片之四级片| 国产亚洲精品7777| 亚洲影院久久精品| 麻豆国产精品视频| 成人国产亚洲欧美成人综合网| 99久久婷婷国产精品综合| 欧美午夜精品理论片a级按摩| 91精品麻豆日日躁夜夜躁| 欧美精品一区二区三区视频| 成人欧美一区二区三区在线播放| 午夜伦欧美伦电影理论片| 激情国产一区二区| 成人免费视频caoporn| 欧美日韩国产片| 中文字幕精品—区二区四季| 香港成人在线视频| 丁香婷婷深情五月亚洲| 欧美日韩免费观看一区三区| 国产亚洲欧美日韩俺去了| 亚洲宅男天堂在线观看无病毒| 国内久久婷婷综合| 欧美午夜片在线观看| 国产精品三级电影| 久久av资源站| 欧美日韩久久久一区| 日本一区二区视频在线| 婷婷久久综合九色国产成人| 成人黄页毛片网站| 日韩欧美亚洲一区二区| 亚洲综合色丁香婷婷六月图片| 国产精品一二三在| 91精品国产一区二区人妖| 亚洲欧美日韩国产综合| 国产精品性做久久久久久| 在线观看91av| 亚洲一卡二卡三卡四卡五卡| 不卡一区二区三区四区| 2021中文字幕一区亚洲| 免费观看在线色综合| 欧美调教femdomvk| 亚洲免费观看高清完整| 成人av免费在线播放| 国产欧美日韩视频在线观看| 大胆亚洲人体视频| 欧美剧在线免费观看网站| 一区二区三区毛片| 一本一道综合狠狠老| 中文字幕精品在线不卡| 国产成人av一区二区三区在线| 欧美一区二区三区视频在线 | 欧美电影免费观看完整版| 亚洲成人手机在线| 91久久奴性调教| 亚洲综合自拍偷拍| 欧美在线观看视频在线| 一区二区三区在线免费| 一本高清dvd不卡在线观看| 中文字幕中文字幕中文字幕亚洲无线| 国产一区二区不卡在线| 久久久99精品免费观看不卡| 国产一区不卡精品| 久久免费视频一区| 国产不卡高清在线观看视频| 日本一区二区三区在线观看| 成人av在线观| 亚洲综合一二三区| 欧美肥妇free| 午夜精品久久久久久久| 91首页免费视频| 亚洲成人在线观看视频| 欧美精品丝袜久久久中文字幕| 亚洲丶国产丶欧美一区二区三区| 欧美日韩亚洲综合在线| 日韩中文欧美在线| 久久久噜噜噜久久中文字幕色伊伊| 国产91丝袜在线播放0| 亚洲色图制服诱惑| 欧美艳星brazzers| 日韩av不卡在线观看| 久久久夜色精品亚洲| 成人免费黄色大片| 亚州成人在线电影| 久久免费精品国产久精品久久久久| 成人精品电影在线观看| 亚洲黄一区二区三区| 欧美一区三区四区| eeuss国产一区二区三区| 爽好多水快深点欧美视频| 久久嫩草精品久久久久| 欧美视频三区在线播放| 国产呦萝稀缺另类资源| 亚洲欧美国产高清| 欧美电视剧在线观看完整版| 99久久国产综合精品麻豆| 蜜桃视频一区二区三区| 一区二区在线观看视频| 久久综合久久鬼色| 欧美日韩国产在线观看| 国产成人欧美日韩在线电影| 午夜影视日本亚洲欧洲精品| 久久久777精品电影网影网 | 日本精品一区二区三区高清 | 久久精品视频网| 欧美日韩不卡在线| 99久久国产综合精品麻豆 | 看电视剧不卡顿的网站| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 欧美一区二区三区婷婷月色| 国产一区视频网站| 亚洲成av人影院在线观看网| 亚洲国产经典视频| 2020国产精品自拍| 日韩欧美的一区二区| 欧美日韩国产一区二区三区地区| 国产91综合一区在线观看| 美女高潮久久久| 日韩电影在线免费看| 一区二区三区四区高清精品免费观看 |