LUA Web开发学习笔记是本文要介绍的内容,主要是来了解LUA中的Web开发,不多说,具体内容的实现来看本文详解。
Kepler环境搭建
我本身是做Web开发的,自然喜欢把新学习的东西往Web方面联系。提到Web和Lua,所有人都会自然而然的想起一个开源的项目Kepler (http://www.keplerproject.org/)。它给我最大的感觉就是短小精悍,实在有点难以置信,包括Socket, IO, TCP/IP, HTTP, WebCGI等众多功能模块的软件包在内的下载和安装包,居然只有900K左右!安装的过程也很简单,我写一下我在Windows2003/XP下安装Kepler的过程:
1、下载并安装LuaRocks (http://www.luarocks.org/),默认的最新版本安装目录在 C:LuaRocks.5.2,安装之后,推荐将这个目录加入Windows系统Path环境参数中。
2、在CMD命令窗口中键入 luarocks install kepler-xavante (没加Path参数的,需要打出 luarocks 全路径),注意,此时你的电脑一定要可以正常连结网络,以便可以在网上下载Kepler, Xavante程序功能包,会有约3~5分钟的下载安装过程。
3、Kepler安装完成后,C:LuaRocks 目录下会新建2个子目录 bin 和 rocks,bin下面是Kepler核心的可执行文件,rocks 下面是它使用到的Lua软件功能包和配置信息。安装完成之后,建议将 C:LuaRocks.in 目录也加入Windows系统Path环境参数中。
4、运行 setup-kepler (没加Path参数的,需要打出 C:LuaRocks.insetup-kepler )批处理命令进行默认Web站点的配置。我采用Kepler安装后默认的配置,如果希望改变配置,可以修改 C:LuaRocks
ockskepler1.1-1.in 目录下 setup-kepler 文件内容。
5、Web站点初始化完毕,会发现 C:LuaRocks 目录下,又多出一个 kepler 子目录(此目录名和以上安装Web站点的配置有关),这就是以后我们经常关注的站点内容了,打开 C:LuaRockskeplerhtdocs est.lp 文件看看,是不是感觉中间的内容就是Lua语法的ASP/JSP? :)
6、Web网站的内容都具备了,就差启动Web服务器进程了。运行 xavante_start (没加Path参数的,需要打出 C:LuaRocks.inxavante_start )批处理命令就可以,关于Web网站的参数配置,下文会详细介绍。
安装的工作已经完成了,如果采用的是Kepler的默认配置,那么用你的浏览器打开 http://localhost:8080/ 是不是看到Kepler的欢迎页面了?
喜欢正版攻略的朋友,安装的过程也可以参照 http://www.keplerproject.org/en/Installation ,不过我感觉它写的不够详细,尤其是最后一步,存在错误:直接运行 xavante.exe 文件会造成引用库找不到的错误,不能成功启动Web服务程序的,这是由于环境路径没有配置好的原因,稍微细心点的朋友,打开 C:LuaRocks.inxavante_start.bat 文件,一看便知。
Xavante参数配置
在Kepler软件包中,真正起Web服务器作用的模块叫做Xavante。它的配置文件是一个Lua文件,它位于 C:LuaRockskepleretcxavanteconfig.lua ,在使用 setup-kepler 命令安装站点之前,可以修改Kepler默认的配置文件 C:LuaRocks
ockskepler1.1-1confxavanteconfig.lua 让你的修改生效于以后所有创建的新网站。下面我们看看这个配置文件的配置内容。(Kepler官方手册关于Xavante的说明请参见
- http://www.keplerproject.org/xavante/
这个文件的默认内容:
-- 文件开头关于版权信息略去
- require "xavante.filehandler"
- require "xavante.cgiluahandler"
- require "xavante.redirecthandler"
- require "orbit.ophandler"
- -- 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)
- },
- { -- ophandler example
- match = {"%.op$", "%.op/.*$" },
- with = orbit.ophandler.makeHandler (webDir)
- },
- { - wsapihandler example
- match = {"%.ws$", "%.ws/" },
- with = wsapi.xavante.makeGenericHandler (webDir)
- },
- { -- filehandler example
- match = ".",
- with = xavante.filehandler,
- params = {baseDir = webDir}
- },
- }
- Displays a message in the console with the used ports
- xavante.start_message(function (ports)
- local date = os.date("[%Y-%m-%d %H:%M:%S]")
- print(string.format("%s Xavante started on port(s) %s",
- date, table.concat(ports, ", ")))
- end)
- xavante.HTTP{
- server = {host = "*", port = 8080},
- defaultHost = {
- rules = simplerules
- },
- }
文件共分3个部分:
- simplerules, xavante.start_message, xavante.HTTP:
simplerules :类似于ASP.Net在IIS里面的URL Rewrite功能的URL重发功能,说白了就是依次检索,找到匹配的Request URL正则项,转发给这个匹配项中所定义的Web站点中某个脚本文件进行运算,最后返回HTTP Response的内容。
xavante.start_message :用于记录每次Xavante进程启动后,程序发生的Log记录格式的配置。
xavante.HTTP: 用于Web服务器主要参数配置。修改port = 8080, 可以修改HTTP服务的默认端口。如果想在你的Xavante服务器上绑定域名,请添加一项:
- virtualHosts = {
- ["www.rex.com"] = simplerules --www.rex.com 就是你自己网站的域名
- },
注意:这里 virtualHosts 的 H 一定要大写,否则程序将报错!这一点,是Kepler官方网站资料上存在笔误,我调了半个多小时才尝试出来这一点,希望后来的朋友少走点弯路。还有就是,配置了 virtualHosts 节之后,原来的 defaultHost 节内容不能去掉,不然也会造成程序出错,加入了域名绑定后,我完整的 xavante.HTTP 配置如下:
- xavante.HTTP{
- server = {host = "*", port = 80},
- defaultHost = {
- rules = simplerules
- },
- virtualHosts = {
- ["www.rex.com"] = simplerules
- },
- }
注意:如果这事你有其它Web服务程序(如Appach ISS等)同时使用80端口,也将造成Xavante启动出错。因此,请在启动Xavante之前,暂停其它Web服务程序。这一点,我一直很费解:为什么Xavante的配置非要将Port的配置强制加到每个站点上去呢?我是新手,请熟悉的朋友指教一二,非常感谢!
我尝试使用Kepler和Xavante只有2天左右,先写这么多,希望有机会和对此感兴趣的朋友讨论学习!
将LUA嵌入ASP.Net页面
考虑到Xavante的稳定性问题,我决定尝试一下使用IIS作为Web服务器,并且在ASP.Net里面使用Progress对象调用LUA的VM来调用LUA代码。新建一个ASPX页面,写入以下Code behind代码:
- using System.Collections;
- using System.Configuration;
- using System.Data;
- using System.Linq;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.HtmlControls;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Xml.Linq;
- using System.Diagnostics;
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!object.Equals(Request["lua"], null))
- {
- string luaFile = Request["lua"];
- if (!string.IsNullOrEmpty(luaFile))
- {
- Response.Cache.SetNoStore();
- Response.Cache.SetNoServerCaching();
- string output = _Default.EnvokeLua(this, luaFile);
- Response.Write(output);
- Response.End();
- }
- }
- }
- static string EnvokeLua(Page pg,string luaFile)
- {
- string rtval = string.Empty;
- HttpServerUtility hsu = pg.Server;
- string exeFile = hsu.MapPath("~/lib/lua.exe");
- string luaPath = hsu.MapPath(string.Format("~/lua/{0}.lua", luaFile));
- using (Process proc = new Process())
- {
- proc.StartInfo.FileName = exeFile;
- proc.StartInfo.Arguments = string.Format(@" {0}", luaPath);
- proc.StartInfo.RedirectStandardOutput = true;
- proc.StartInfo.UseShellExecute = false;
- proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
- proc.Start();
- proc.WaitForExit();
- rtval = proc.StandardOutput.ReadToEnd();
- }
- return rtval;
- }
- }
这样很简单,通过一个ASPX页面作为代理,就可以解释执行LUA文件了:通过访问 http://localhost/default.aspx?lua=abc.lua ,你就可以解释执行位于该网站相对LUA目录下 abc.lua 文件,并获得输出,在通过HTTP Response的方式获得输出了。这种纯粹的Text输出方式,也比较适合使用AJAX和REST的Web程序中。
小结:深度解析LUA Web开发学习笔记的内容介绍完了,希望通过本文的学习能对你有所帮助!学习笔记的内容介绍完了,希望通过本文的学习能对你有所帮助!