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 是一个 MVC 类型的 Lua web 框架。它完全抛弃了 CGILua 的脚本即应用的模型,在此模型中每个 Orbit 应用都可以放在一个文件中,如果你愿意,每个应用也可以被分割在多个文件到。
所有的 Orbit 应用都支持 WSAPI 协议,所以它们也就兼容 Xavante, CGI 和 Fastcgi。它还自带了一个启动器,以启动一个 Xavante 实例便于开发。
安装 Orbit 最简单的方式是使用 LuaRocks。 luarocks 用命令行的方式安装 orbit。因此,首先你需要安装luaRocks。
如果你没安装所需的依赖,下面的步骤会引导你在 Unix/Linux 环境下搭建 Orbit 环境。
连接服务器,安装 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
$ sudo apt-get install luarocks
$ sudo luarocks install orbit
$ sudo luarocks install wsapi-xavante
$ sudo luarocks install wsapi-fcgi
$ 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
#!/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 更加详细内容。
正如前面所说的,WSAPI 是大多数项目的基础,它内嵌了大量的特性。你现在可以在下面的这些系统平台上使用 WSAPI:
- Windows
- UNNIX 类系统
WSAPI 支持的服务器和接口包括:
- CGI
- FastCGI
- Xavante
WSAPI 提供了大量库方便我们使用 Lua 进行 Web 应用的开发。下面列出了其支持的部分特征:
- 请求处理
- 输出缓存
- 认证机制
- 文件上传
- 请求隔离
- 复用
#!/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 是一款支持 HTTP 1.1 的 Lua web 服务器。它采用模块化的结构设计,使用 URI 映射处理程序的方式进行路由。 Xavante 目前支持:
- 文件处理程序
- 重定向处理程序
- 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
}
}
- 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 功能。