Lua Web程式設計


Lua是一種高度靈活的語言,通常用於多種平台,包括Web應用程式。 開普勒(Kepler)社群成立於2004年,旨在為Lua提供開源Web元件。

儘管已經有很多Lua Web開發是使用Lua的Web框架,但這裡主要介紹和使用Kepler社群提供的元件。

Lua常用應用程式和框架

  • Orbit - Orbit是Lua的MVC Web框架,基於WSAPI。
  • WSAPI - WSAPI是從Lua Web應用程式抽象Web主機伺服器的API,是許多專案的基礎。
  • Xavante - 是一個提供WSAPI介面的Lua Web伺服器。
  • Sputnik - 是一個wiki/CMS,通過用於幽默和娛樂的Kepler專案的WSAPI開發。
  • CGILua - 基於WSAPI提供LuaPages和LuaScripts網頁建立,但不再受支援。 請改用Orbit,Sputnik或WSAPI。

在本教學中,將讓您了解Lua可以執行的操作,並了解有關其安裝和使用的更多資訊,請參閱kepler網站。

Orbit

Orbit是Lua的MVC Web框架。 它完全放棄了CGILua「指令碼」模型,轉而支援應用程式,每個Orbit應用程式都可以放在一個檔案中,但如果需要,可以將它分成多個檔案。

所有Orbit應用程式都遵循WSAPI協定,因此它們目前與Xavante,CGI和Fastcgi一起使用。 它包含一個啟動程式,可以輕鬆啟動Xavante範例進行開發。

安裝Orbit的最簡單方法是使用LuaRocks。 Luarocks是安裝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檔案可以在本地覆蓋組態。

<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>

重新啟動伺服器以確保所做的更改生效。
要啟用應用程式,需要將+ExecCGI新增到Orbit應用程式根目錄中的.htaccess檔案中 - 在本例中目錄為/var/www

Options +ExecCGI
DirectoryIndex index.ws

Orbit簡單範例 -

#!/usr/bin/env index.lua

-- index.lua
require"orbit"

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

-- handler

function index(web)
   return my_home_page()
end

-- dispatch
myorbit:dispatch_get(index, "/", "/index")

-- Sample page

function my_home_page()

   return [[
      <head></head>
      <html>
         <h2>First Page</h2>
      </html>
   ]]

end

現在,可以啟動Web瀏覽器了。 轉到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())

WSAPI

如前所述,WSAPI充當許多專案的基礎,並在其中嵌入了多個功能。 可以使用WSAPI並支援以下平台 -

  • Windows
  • UNIX類系統

WSAPI支援的伺服器和介面包括 -

  • CGI
  • FastCGI
  • Xavante

WSAPI提供了許多庫,可以更輕鬆地使用Lua進行Web程式設計。 Lua中的一些受支援的功能包括,

  • 請求處理
  • 輸出緩衝
  • 認證
  • 檔案上傳
  • 請求隔離
  • 並行傳輸

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 - by tw511.com !</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),標題和html頁面。

Xavante

Xavante是一個Lua HTTP 1.1 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.tw511.com"] = simplerules
   }
}

Lua的Web元件

  • Copas - 一個基於協同程式的排程程式,可以由TCP/IP伺服器使用。
  • Cosmo - 一個「安全模板」引擎,可以保護應用程式免受模板中任意程式碼的攻擊。
  • Coxpcall - 它將Lua native pcall和xpcall與coroutine相容。
  • LuaFileSystem - 一種存取底層目錄結構和檔案屬性的可移植方式。
  • Rings - 一個程式庫,提供從Lua內部建立新的Lua狀態的方法。

結束說明

有許多基於Lua的Web框架和元件可供使用,根據需要選擇它。 還有其他可用的Web框架,包括以下內容 -

  • Moonstalk可以高效地開發和託管使用Lua語言構建的動態生成的基於Web的專案; 從基本頁面到複雜的應用程式。
  • Lapis,這是一個使用MoonScript(或Lua)構建Web應用程式的框架,它在一個名為OpenResty的Nginx客製化版本中執行。
  • Lua Server Pages 是一個Lua指令碼引擎外掛,它打破了嵌入式Web開發的任何其他方法,為傳統的C伺服器頁面提供了顯著的捷徑。

這些Web框架可在Web應用程式中充分利用,以執行強大的操作功能。