• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua和Nginx结合使用的超级指南

Lua和Nginx结合使用的超级指南

作者:goldensun 字体:[增加 减小] 来源:互联网

goldensun 通过本文主要向大家介绍了nginx lua,nginx lua开发,nginx lua redis,lua nginx module,nginx lua 安装等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

 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,它返回一个有情感价值分析的单词或者句子。比如,下面的请求(你可以自己试试)

上面的请求将返回包含fantastic情感分析单词的json串。

我们有了扩展对象,接下来继续吧…

分析部分: 扩展Sentiment API

有很多方式你可以扩展Sentiment API(或者你自己的API)。为了符合这篇文章的主题,我们限定了三种场景来展示nginx+lua的强大之处和可扩展性。
1) 想做数据转换?

想把输出数据从json转换为xml格式?或者更好一些,把xml转换为json。
2) 想更换你的API方法的签名?

你想把漂亮的 REST形式的url path/v1/word/WORD.json替换为貌似更加 “漂亮的” 签名方式 parameters/sentiment?action=word&word=WORD&version=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配置文件中的相关配置:

  # 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 ;
  }
}</div>

这里我们只配置了一个路由地址:/v1/word/your-word-goes-here.json。这个路由在Sentiment API上返回一个结果. Nginx 只是负责做一个简单的传递。

你可以启动你的nginx (监听本地端口 8181) ,用下面的方式发送一个请求

它将返回一个同样的json

我们只是给真实的Sentiment API做了个中转。让我们带着兴趣继续吧…

1) 数据转换
JSON 到 XML

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

  # 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;
  }
}</div>

我们仅添加了一个新路由:/v1/word/your-word-goes-here.xml。这个路由将把 Sentiment API输出的json转换为xml格式。我们没有做一个传递,而是通过调用一个lua文件实现逻辑的(不要担心,很简单)。

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

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

你将获取到下面信息:

<response>
  <sentiment>4</sentiment>
  <word>fantastic</word>
</response></div>

这里发生了什么?好吧,我们基本上把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文件

require("os")
local cjson = require "cjson"
 
local path = ngx.va

您可能想查找下面的文章:

  • Nginx+lua 实现调用.so文件
  • lua 基础教程
  • Lua中使用模块的一些基础知识
  • Lua和Nginx结合使用的超级指南
  • 使用Lua编写Nginx服务器的认证模块的方法
  • 把Lua编译进nginx步骤方法
  • 在Lua中使用模块的基础教程
  • 实现Lua中数据类型的源码分享
  • 使用nginx+lua实现信息访问量统计
  • 安装Nginx+Lua开发环境

相关文章

  • Lua中的类编程代码实例
  • Lua中简单的错误处理实例
  • Lua教程(一):在C++中嵌入Lua脚本
  • Lua面向对象之多重继承、私密性详解
  • Lua中__index和__newindex之间的沉默与合作
  • Lua中获取table长度的方法
  • Lua基础教程之表(Table)学习笔记
  • Lua中的loadfile、dofile、loadstring、require用法实例
  • Lua中字符串(string)浅析
  • Lua中ipair和pair的区别

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua中编译执行代码相关的函数详解
    • Lua中使用table.concat连接大量字符串实例
    • Lua教程(三):C语言、C++中调用Lua的Table示例
    • Lua中的模块与module函数详解
    • Lua教程(二):基础知识、类型与值介绍
    • Lua中的元表(metatable)、元方法(metamethod)详解
    • Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
    • Lua中的文件I/O操作教程
    • 深入解读Lua中迭代器与泛型for的使用
    • Lua教程(一):简介、优势和应用场景介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有