Lua - Web 编程
Lua 是一种高度灵活的语言,经常用于多个平台,包括 web 应用程序。Kepler 社区成立于 2004 年,旨在为 Lua 提供开源 web 组件。
尽管有其他使用 Lua 的 web 框架已被开发,但我们将主要关注 Kepler 社区提供的组件。
应用程序和框架
Orbit 是基于 WSAPI 的 Lua MVC web 框架。
WSAPI 是将 web 主机服务器与 Lua web 应用程序抽象化的 API,是许多项目的基石。
Xavante 是一个提供 WSAPI 接口的 Lua Web 服务器。
Sputnik 是一个基于 Kepler 项目开发的 wiki/CMS,用于幽默和娱乐,构建在 WSAPI 之上。
CGILua 提供 LuaPages 和 LuaScripts 网页创建功能,基于 WSAPI,但已不再支持。请改用 Orbit、Sputnik 或 WSAPI。
在本教程中,我们将尝试让您了解 Lua 的能力,要了解更多关于其安装和用法的信息,请参考 Kepler 网站。
Orbit
Orbit 是 Lua 的 MVC web 框架。它完全放弃了 CGILua 的“脚本”模型,转而采用应用程序模式,每个 Orbit 应用程序可以放入单个文件中,但如果需要,也可以拆分成多个文件。
所有 Orbit 应用程序都遵循 WSAPI 协议,因此目前可以与 Xavante、CGI 和 FastCGI 一起工作。它包含一个启动器,便于启动 Xavante 实例进行开发。
安装 Orbit 最简单的方式是使用 LuaRocks。命令为 luarocks install orbit。为此,您需要先安装 LuaRocks。
如果您尚未安装所有依赖项,以下是在 Unix/Linux 环境中设置 Orbit 的步骤。
安装 Apache
连接到您的服务器。使用以下命令安装 Apache2、其支持模块并启用所需的 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 文件可以本地覆盖配置。
httpd.conf
<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 应用程序根目录(在本例中为 /var/www)下的 .htaccess 文件中添加 +ExecCGI。
.htaccess
Options +ExecCGI DirectoryIndex index.ws
简单示例 − Orbit
index.lua
#!/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
输出
现在,你应该能够启动你的 web 浏览器。访问 http://localhost:8080/,你应该会看到以下输出 −
First Page
Orbit 提供了另一种选项,即 Lua 代码可以生成 html。
index.lua
#!/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())
创建表单的示例
下面展示了一个简单的表单示例 −
index.lua
#!/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())
WSAPI
如前所述,WSAPI 作为许多项目的基石,并集成了多项功能。你可以使用 WSAPI 并支持以下平台,
Windows
基于 UNIX 的系统
WSAPI 支持的服务器和接口包括,
CGI
FastCGI
Xavante
WSAPI 提供了一系列库,这使得我们使用 Lua 进行 web 编程更加容易。Lua 中支持的一些功能包括,
请求处理
输出缓冲
身份验证
文件上传
请求隔离
多路复用
WSAPI 示例
下面展示了一个简单的 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 状态码(200)、headers 和 html 页面。
Xavante
Xavante 是一个基于 URI 映射处理程序的模块化架构的 Lua HTTP 1.1 Web 服务器。Xavante 当前提供以下功能:
文件处理程序
重定向处理程序
WSAPI 处理程序
文件处理程序用于处理普通文件。重定向处理程序用于实现 URI 重映射,WSAPI 处理程序用于处理 WSAPI 应用程序。
下面展示了一个简单的示例。
require "xavante.filehandler"
require "xavante.cgiluahandler"
require "xavante.redirecthandler"
-- 在此处定义 Xavante HTTP 文档脚本的位置
local webDir = XAVANTE_WEB
local simplerules = {
{ -- URI 重映射示例
match = "^[^%./]*/$",
with = xavante.redirecthandler,
params = {"index.lp"}
},
{ -- cgiluahandler 示例
match = {"%.lp$", "%.lp/.*$", "%.lua$", "%.lua/.*$" },
with = xavante.cgiluahandler.makeHandler (webDir)
},
{ -- filehandler 示例
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 Components
Copas,一个基于协程的调度器,可供 TCP/IP 服务器使用。
Cosmo,一个“安全模板”引擎,可保护您的应用程序免受模板中任意代码的影响。
Coxpcall 使用与协程兼容的版本封装了 Lua 原生的 pcall 和 xpcall。
LuaFileSystem,一种便携的方式来访问底层目录结构和文件属性。
Rings,一个库,提供了一种从 Lua 内部创建新 Lua 状态的方法。
结束语
有许多基于 Lua 的 Web 框架和组件可供我们使用,根据需求可以选择合适的一个。还有其他可用的 Web 框架,包括以下:
Moonstalk 支持使用 Lua 语言高效开发和托管动态生成的基于 Web 的项目;从基本页面到复杂应用程序。
Lapis,一个用于使用 MoonScript(或 Lua)构建 Web 应用程序的框架,它运行在定制版本的 Nginx(称为 OpenResty)中。
Lua Server Pages,一个 Lua 脚本引擎插件,它超越了其他嵌入式 Web 开发方法,为传统的 C 服务器页面提供了显著的捷径。
这些 Web 框架可以提升您的 Web 应用程序,并帮助您执行强大的操作。