# Lua Web 编程 Lua 是一种非常灵活的语言,它经常被用在各种平台上,包括 web 应用。其中关于 Lua Web 项目最著名的就是 Kepler 项目了。Kepler 社区成立于 2004 年,一直致力于为 Lua 提供开源的 web 组件。 尽管其它开发者也已经推出了许多的 Lua web 应用框架,但是我们还是想主要介绍一下由 Kepler 社区开发的 web 开发组件。 ## 应用与框架 在本教程中,我们会让你了解到在 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 ``` 在配置文件的 的节中增如下的节。如果下面节中有 AllowOverride None, 你需将 None 改为 All,如此 .htaccess 才能覆盖本地配置。 ``` 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 ``` 配置好后重启服务器使得配置更改生效。 为了使你的应用可以运行,你需要在你的 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 [[

First Page

]] 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: WSAPI 支持的服务器和接口包括: 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("") coroutine.yield("

Hello Wsapi!

") coroutine.yield("

PATH_INFO: " .. wsapi_env.PATH_INFO .. "

") coroutine.yield("

SCRIPT_NAME: " .. wsapi_env.SCRIPT_NAME .. "

") coroutine.yield("") end return 200, headers, coroutine.wrap(hello_text) end ``` 很容易看出来,上面的代码生成了一个简单的 html 页面。同时,你可以看到使用协程可以将 html 语句一条一条的返回给调用函数。最终返回的是 html 状态码(200)、头部以及 html 页面。 #### Xavante Xavante 是一款支持 HTTP 1.1 的 Lua web 服务器。它采用模块化的结构设计,使用 URI 映射处理程序的方式进行路由。 Xavante 目前支持: 文件处理程序用于一般文件;重定向处理程序实现 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 组件 ## 结束语 根据我们的需求,我们可以找到很多适合我们的 Lua web 框架和组件。下面列出了另外一些可用的框架:   充分利用这些 Web 框架,它可以帮助你实现更加丰富的 web 功能。