1. ホーム
  2. スクリプト・コラム
  3. ルア

Luaによるネットワークプログラミングの基本例

2022-02-10 14:28:47

 Luaは柔軟性の高い言語であり、Webアプリケーションをはじめ、マルチプラットフォームで使用されることが多い。2004年に設立されたKeplerコミュニティは、LuaのWebコンポーネントのオープンソースコードを提供しています。

Luaを使用して開発されたWebフレームワークは他にもありますが、ここでは主にKeplerコミュニティが提供するコンポーネントに焦点を当てます。
アプリ・フレームワーク

  •     OrbitはWSAPIをベースとしたluaのMVCウェブフレームワークです。
  •     WSAPIは、LuaのWebアプリケーションを抽象化したWebホストサーバで、多くのプロジェクトのAPIをベースにしています。
  •     XavanteはWSAPIインターフェイスを提供するLua用Webサーバーです。
  •     SputnikはWSAPI Keplerプロジェクトで開発されたWiki/CMSで、楽しくて愉快なものです。
  •     CGILuaはWSAPIをベースにしたLuaPagesとLuaScriptsのウェブオーサリングを提供しますが、サポートは終了しています。代わりに Orbit、Sputnik、WSAPI を使ってください。

このチュートリアルでは、Luaのインストールや使い方など、より多くのことができるようにするため、ケプラー社のウェブサイトを参照してください
軌道

Orbitは、luaのMVCウェブフレームワークです。CGILuaアプリケーションを完全に捨て、各アプリケーションOrbitはCGILuaモードで1つのファイル"script"を保持できますが、必要なら複数のファイルに分割することも可能です。

すべての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" がある場合、htaccess ファイルが設定を上書きできるように、 "None" を "All" に変更する必要があります。

コピーコード コードは以下の通りです。
<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>

サーバーを再起動して、変更が有効になったことを確認します。

アプリケーションをアクセス可能にするには、htaccessファイルでOrbitアプリケーションのルートに+ ExecCGIを追加する必要があります - この場合、/var/wwwに設定します。

コピーコード コードは以下の通りです。
Options +ExecCGI
DirectoryIndex index.ws

簡単な例 - オービット

コピーコード コードは以下の通りです。
#! /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

これで、ウェブブラウザを起動し、http://localhost:8080/ にアクセスすると、次のように表示されるはずです。

コピーコード コードは以下の通りです。
First Page

Orbitはもう一つの選択肢として、htmlを生成する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.htmllify(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.htmllify(wrap,test)

print(test())

公式サイトには長い軌道のチュートリアルがあります
ワサピ

前述の通り、WSAPIは多くのプロジェクトによって組み込まれた複数の機能の基盤として機能しています。WASAPIは、以下のプラットフォームで使用でき、サポートしています。

  •     Windows
  •     UNIX系システム

WSAPIでサポートされているサーバーとインターフェースは以下の通りです。

  •     CGI
  •     FastCGI
  •     ザバンテ

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!</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ページの構成で見ることができます。連結を使用することで、returnステートメントで関数を呼び出すことが可能であることがわかります。最終的なHTMLのステータスコード(200)、ヘッダー、HTMLページの戻り値です。
ザバンテ

Xavante は Lua1.1 HTTP Web サーバーマッピングハンドラーで、モジュラー URI ベースのアーキテクチャを採用しています。Xavanteは現在、以下の機能を提供しています。

  •     ファイルハンドラ
  •     リダイレクトハンドラ
  •     WSAPIハンドラ

ファイルハンドラは一般的なファイルに対して使用されます。リダイレクトハンドラは、WSAPIアプリケーションでURIのリマッピングと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ウェブコンポーネント

  •     Copasは、コンカレントスケジューラに基づいて、TCP/IPプロトコルでサーバーを使用することができます。
  •     Cosmoは、アプリケーションのテンプレートに任意のコードが含まれることを防ぐ、quot;secure template"エンジンです。
  •     Coxpcall Luaは、ネイティブのpcallとxpcallを並行処理互換性を持ってラップしています。
  •     LuaFileSystem:基盤となるディレクトリ構造とファイルプロパティにアクセスするためのポータブルな方法です。
  •     Rings:Luaの中から新しいLuaの状態を作成する方法を提供するライブラリです。

注意事項

LuaベースのWebフレームワークやコンポーネントは非常に多く、必要に応じて、オプションとして利用することが可能です。他にも、以下のような利用可能なWebフレームワークがあります。

  •     Moonstalkは、基本的なWebページから複雑なアプリケーションまで、Luaで構築された動的に生成されるWebベースのプロジェクトを効率的に開発し、ホストすることができます。
  •     MoonScript (または LUA) でウェブアプリケーションを構築するためのフレームワークである Lapis は、OpenResty という Nginx のカスタムバージョンで動作します。
  •     Luaサーバーページ、Luaスクリプトエンジンのプラグインは、従来のCサーバーページへの劇的なショートカットを提供するWeb開発を組み込むための他の任意の方法です。

これらのWebフレームワークは、Webアプリケーションを活用し、強力なオペレーションを行うのに役立ちます。