离线下载
PDF版 ePub版

极客学院团队出品 · 更新于 2018-11-28 11:00:43

Web 编程

Lua 是一种非常灵活的语言,它经常被用在各种平台上,包括 web 应用。其中关于 Lua Web 项目最著名的就是 Kepler 项目了。Kepler 社区成立于 2004 年,一直致力于为 Lua 提供开源的 web 组件。

尽管其它开发者也已经推出了许多的 Lua web 应用框架,但是我们还是想主要介绍一下由 Kepler 社区开发的 web 开发组件。

应用与框架

  • Orbit 是一个基于 WSAPI 的 MVC web 框架(译注: MVC,模型-视图-控制器)。
  • WSAPI 是一套从 Lua web 应用中抽象出来的 web 服务 API,它是许多其它项目的基础。
  • Xavante 是一个提供 WSAPI 的 Lua Web 服务器。
  • Sputnik 是 Kepler 项目中开发的 wiki/CMS 构架,它也基于 WSAPI。
  • CGILua 支持 LuaPages 和 LuaScripts 网络页面的创建,基于 WSAPI,不过已经不再提供支持。

在本教程中,我们会让你了解到在 Web 应用开发中 Lua 可以完成哪些工作。了解更多安装和使用说明,可以参阅kepler website

Orbit

Orbit 是一个 MVC 类型的 Lua web 框架。它完全抛弃了 CGILua 的脚本即应用的模型,在此模型中每个 Orbit 应用都可以放在一个文件中,如果你愿意,每个应用也可以被分割在多个文件到。

所有的 Orbit 应用都支持 WSAPI 协议,所以它们也就兼容 Xavante, CGI 和 Fastcgi。它还自带了一个启动器,以启动一个 Xavante 实例便于开发。

安装 Orbit 最简单的方式是使用 LuaRocks。 luarocks 用命令行的方式安装 orbit。因此,首先你需要安装luaRocks

如果你没安装所需的依赖,下面的步骤会引导你在 Unix/Linux 环境下搭建 Orbit 环境。

安装 Apache

连接服务器,安装 Apache2。

$ sudo apt-get install apache2 libapache2-mod-fcgid libfcgi-dev build-essential
$ sudo a2enmod rewrite
$ sudo a2enmod fcgid
$ sudo /etc/init.d/apache2 force-reload

安装 LuaRocks

$ sudo apt-get install luarocks

安装 WSAPI,FCGI,Orbit,Xavante

$ sudo luarocks install orbit
$ sudo luarocks install wsapi-xavante
$ sudo luarocks install wsapi-fcgi

配置 Apache2

$ sudo raj /etc/apache2/sites-available/default

在配置文件的 <Directory /var/www/> 的节中增如下的节。如果下面节中有 AllowOverride None, 你需将 None 改为 All,如此 .htaccess 才能覆盖本地配置。

<IfModule mod_fcgid.c>
    AddHandler fcgid-script .lua
    AddHandler fcgid-script .ws
    AddHandler fcgid-script .op
    FCGIWrapper "/usr/local/bin/wsapi.fcgi" .ws
    FCGIWrapper "/usr/local/bin/wsapi.fcgi" .lua
    FCGIWrapper "/usr/local/bin/op.fcgi" .op
    #FCGIServer "/usr/local/bin/wsapi.fcgi" -idle-timeout 60 -processes 1
    #IdleTimeout 60
    #ProcessLifeTime 60
</IfModule>

配置好后重启服务器使得配置更改生效。

为了使你的应用可以运行,你需要在你的 Orbit 应用根目录下的 .htaccess 文件中添加 +ExecCGI,在本例中根目录为 /var/www。

Options +ExecCGI
DirectoryIndex index.ws

示例——Orbit

#!/usr/bin/env index.lua
-- index.lua
require"orbit"

-- 声明
 module("myorbit", package.seeall, orbit.new)

-- 处理程序
function index(web)
  return my_home_page()
end

-- 分配器
myorbit:dispatch_get(index, "/", "/index")

-- 样例页面
function my_home_page()
   return [[
    <head></head>
    <html>
    <h2>First Page</h2>
    </html>
    ]]
end

现在,你可以启动你的浏览器访问 http://localhost:8080 就可以看到下面的结果:

First Page

Orbit 还提供了另外选项,该选项使得 Lua 代码可以生成 html。

#!/usr/bin/env index.lua
-- index.lua
require"orbit"

function generate()
    return html {
        head{title "HTML Example"},
        body{
            h2{"Here we go again!"}
        }
    }
end

orbit.htmlify(generate)

print(generate())

创建表单

简单的表单创建代码如下:

#!/usr/bin/env index.lua
require"orbit"

function wrap (inner)
    return html{ head(), body(inner) }
end

function test ()
    return wrap(form (H'table' {
        tr{td"First name",td( input{type='text', name='first'})},
        tr{td"Second name",td(input{type='text', name='second'})},
        tr{ td(input{type='submit', value='Submit!'}),
            td(input{type='submit',value='Cancel'})
        },
    }))
end

orbit.htmlify(wrap,test)

print(test())

你可以在官网找到关于 orbit 更加详细内容。

WSPAI

正如前面所说的,WSAPI 是大多数项目的基础,它内嵌了大量的特性。你现在可以在下面的这些系统平台上使用 WSAPI:

  • Windows-
  • UNNIX 类系统

WSAPI 支持的服务器和接口包括:

  • CGI
  • FastCGI
  • Xavante

WSAPI 提供了大量库方便我们使用 Lua 进行 Web 应用的开发。下面列出了其支持的部分特征:

  • 请求处理
  • 输出缓存
  • 认证机制
  • 文件上传
  • 请求隔离
  • 复用

下面是 WSAPI 的一个简单例子。

 #!/usr/bin/env wsapi.cgi

module(..., package.seeall)
function run(wsapi_env)
   local headers = { ["Content-type"] = "text/html" }

   local function hello_text()
      coroutine.yield("<html><body>")
      coroutine.yield("<p>Hello Wsapi!</p>")
      coroutine.yield("<p>PATH_INFO: " .. wsapi_env.PATH_INFO .. "</p>")
      coroutine.yield("<p>SCRIPT_NAME: " .. wsapi_env.SCRIPT_NAME .. "</p>")
      coroutine.yield("</body></html>")
   end

   return 200, headers, coroutine.wrap(hello_text)
end

很容易看出来,上面的代码生成了一个简单的 html 页面。同时,你可以看到使用协程可以将 html 语句一条一条的返回给调用函数。最终返回的是 html 状态码(200)、头部以及 html 页面。

Xavante

Xavante 是一款支持 HTTP 1.1 的 Lua web 服务器。它采用模块化的结构设计,使用 URI 映射处理程序的方式进行路由。 Xavante 目前支持:

  • 文件处理程序
  • 重定向处理程序
  • WSAPI 处理程序<

文件处理程序用于一般文件;重定向处理程序实现 URI 重映射;WSAPI 处理程序用于 WSAPI 应用。
使用示例如下:

require "xavante.filehandler"
require "xavante.cgiluahandler"
require "xavante.redirecthandler"

-- Define here where Xavante HTTP documents scripts are located
local webDir = XAVANTE_WEB

local simplerules = {

    { -- URI remapping example
      match = "^[^%./]*/$",
      with = xavante.redirecthandler,
      params = {"index.lp"}
    }, 

    { -- cgiluahandler example
      match = {"%.lp$", "%.lp/.*$", "%.lua$", "%.lua/.*$" },
      with = xavante.cgiluahandler.makeHandler (webDir)
    },

    { -- filehandler example
      match = ".",
      with = xavante.filehandler,
      params = {baseDir = webDir}
    },
} 

xavante.HTTP{
    server = {host = "*", port = 8080},

    defaultHost = {
        rules = simplerules
    },
}

如果使用 Xavante 虚拟机,xavante.HTTP 需要被修改为如下:

xavante.HTTP{
    server = {host = "*", port = 8080},

    defaultHost = {},

    virtualhosts = {
        ["www.sitename.com"] = simplerules
    }
}

Lua web 组件

  • Copas:基于协程的分配器,可用于 TCP/IP 服务器。
  • Cosmo:一个安全模板引擎,保护应用免受来自模板的任何代码攻击。
  • Coxpcall:封装 Lua 原生的 pcall 和 xpcall 函数,提供协程兼容的版本。
  • LuaFileSystem:以可移植的方式访问底层目录结构和文件属性。
  • Rings:提供在 Lua 中创建新的 Lua state 的方法。

结束语

根据我们的需求,我们可以找到很多适合我们的 Lua web 框架和组件。下面列出了另外一些可用的框架:  

  • Moontalk:提供高效的开发方式,为 Lua 开发的动态 web 应用提供容器,适于各种复杂程度的应用开发。
  • Lapis:使用 MoonScript(或 Lua)的 web 应用框架,它可以运行在 OpenResty 服务器中。
  • Lua Server Pages:一个 Lua 脚本引擎插件,此插件提供了完善的嵌入 web 开发方案。

充分利用这些 Web 框架,它可以帮助你实现更加丰富的 web 功能。

上一篇: 面向对象 下一篇: 数据库访问