Lua和Nginx结合使用的超级指南
Nginx作为API代理
有很多原因说明你为什使用nginx作为API代理。首先因为他是开源的;其次,Nginx有大量的安装基础,他背后有一个强大的社区支持,在性能方面也表现的非常出色。对于我们来说,这是显而易见的,如果开源软件有相同的解决方案我们为啥还要用那些私有的软件。
另外一个极大的优势就是nginx对lua的支持,nginx+lua是一个非常好的组合,它允许使用一个高性能的脚本语言扩展nginx。nginx有很多方法是自带的,但是使用lua没有限制的。
原理很简单。有没有这样的情况你更喜欢使用基于nginx的API代理而不是它自带的方法呢?呵呵,你可以非常简单的添加。
扩展目标:SentimentAPI(可以是任何API)
为了展示nginx和lua的强大之处,我们将使用一个简单的RESTAPI调用Sentiment,不使用任何一行API源码(可以直接使用github上的)。
SentimentAPI是一个非常基础的API,它返回一个有情感价值分析的单词或者句子。比如,下面的请求(你可以自己试试)
curlhttp://api-sentiment.3scale.net/v1/word/fantastic.json
上面的请求将返回包含fantastic情感分析单词的json串。
{"sentiment":4,"word":"fantastic"}
我们有了扩展对象,接下来继续吧…
分析部分:扩展SentimentAPI
有很多方式你可以扩展SentimentAPI(或者你自己的API)。为了符合这篇文章的主题,我们限定了三种场景来展示nginx+lua的强大之处和可扩展性。
1)想做数据转换?
想把输出数据从json转换为xml格式?或者更好一些,把xml转换为json。
2)想更换你的API方法的签名?
你想把漂亮的REST形式的urlpath/v1/word/WORD.json替换为貌似更加“漂亮的”签名方式parameters/sentiment?action=word&word=WORD&version=v1.
我们不能容忍变成那样的路径方式:-)这应该是个反面例子,自从SentimentAPI改为RESTful方式,这个例子应该反过来了。
3)想创建一个新的API方法?
没问题,你可以自己创建个新的API方法得到你想要的,或者有可能,你可以不接触任何API源码来扩展你的API方法。
我们将展示下创建一个SentimentAPI的新方法:用来查找在一个句子中最有情感分析价值的单词。这个方法在SentimentAPI没有提供,但是我们可以通过nginx和lua创建它。
这个案例无论对于用户还是对于API开发者多有很大的潜能。基本上可以允许你自己在不修改源码的基础上定制API,或者,这还有酷毙了的一部分,允许你定制你不能控制的API。想在包含一系列方法的TwitterAPI上创建自己的方法?当然可以,结果可能是你的应用程序代码更简洁了。
这只是使用nginx+lua扩展的三个简单例子。还有一些其他例子我们只是为了突出使用nginx+lua扩展你的API有多么简单和强大。
让我们开始做点实际的东西吧…
使用lua扩展nginx
我们假设你应经对nginx基础概念有了了解(servers,locations,等…)
扩展nginx我们必须先提供lua的支持,它不是ngnix的一部分。我们无需担心因为已经有很多组件编译进了lua,像:
- openresty(在3scale)
- tengine
如果你坚持自己安装:-)你可以自己安装下面的组件:
- Luanginxmodule
- HttpProxymodule
事实上,如果你不想用lua而是更喜欢perl,查看下这个页面lookattheCPANpage,这里提供了全部文档。
基础部分
整个处理过程是代理请求到真实的API,主要通过下面过程:1)捕获请求传递给API2)响应请求,接着3)处理响应。
下面展示了nginx配置文件中的相关配置:
upstreambackend{ #servicename:API; serverapi-sentiment.3scale.net:80max_fails=5fail_timeout=30; }
server{ listen8181;
location~/v1/word/(.*)\.json${ proxy_passhttp://backend/v1/word/$1.json; } }