Lua 是一種非常靈活的語言,它經常被用在各種平臺上,包括 web 應用。其中關于 Lua Web 項目最著名的就是 Kepler 項目了。Kepler 社區(qū)成立于 2004 年,一直致力于為 Lua 提供開源的 web 組件。
盡管其它開發(fā)者也已經推出了許多的 Lua web 應用框架,但是我們還是想主要介紹一下由 Kepler 社區(qū)開發(fā)的 web 開發(fā)組件。
在本教程中,我們會讓你了解到在 Web 應用開發(fā)中 Lua 可以完成哪些工作。了解更多安裝和使用說明,可以參閱kepler website
Orbit 是一個 MVC 類型的 Lua web 框架。它完全拋棄了 CGILua 的腳本即應用的模型,在此模型中每個 Orbit 應用都可以放在一個文件中,如果你愿意,每個應用也可以被分割在多個文件到。
所有的 Orbit 應用都支持 WSAPI 協(xié)議,所以它們也就兼容 Xavante, CGI 和 Fastcgi。它還自帶了一個啟動器,以啟動一個 Xavante 實例便于開發(fā)。
安裝 Orbit 最簡單的方式是使用 LuaRocks。 luarocks 用命令行的方式安裝 orbit。因此,首先你需要安裝luaRocks。
如果你沒安裝所需的依賴,下面的步驟會引導你在 Unix/Linux 環(huán)境下搭建 Orbit 環(huán)境。
連接服務器,安裝 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/> 的節(jié)中增如下的節(jié)。如果下面節(jié)中有 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
現(xiàn)在,你可以啟動你的瀏覽器訪問 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())
簡單的表單創(chuàng)建代碼如下:
#!/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 是大多數項目的基礎,它內嵌了大量的特性。你現(xiàn)在可以在下面的這些系統(tǒng)平臺上使用 WSAPI:
WSAPI 支持的服務器和接口包括:
WSAPI 提供了大量庫方便我們使用 Lua 進行 Web 應用的開發(fā)。下面列出了其支持的部分特征:
下面是 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 頁面。同時,你可以看到使用協(xié)程可以將 html 語句一條一條的返回給調用函數。最終返回的是 html 狀態(tài)碼(200)、頭部以及 html 頁面。
Xavante 是一款支持 HTTP 1.1 的 Lua web 服務器。它采用模塊化的結構設計,使用 URI 映射處理程序的方式進行路由。 Xavante 目前支持:
文件處理程序用于一般文件;重定向處理程序實現(xiàn) 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 框架和組件。下面列出了另外一些可用的框架:
充分利用這些 Web 框架,它可以幫助你實現(xiàn)更加豐富的 web 功能。