当前位置:

首页 > 编程开发 > Lua下基本的网络编程示例

Lua下基本的网络编程示例

Lua 这门语言天生就带着一股子机灵劲儿,它高度灵活,能在各种平台上跑,包括 Web 服务。说到 Lua 的 Web 生态,就不得不提 2004 年成立的 Kepler 社区,它贡献了整套开源的 Lua Web 组件。下面这张图就是 Lua 下基本的网络编程示例的直观展示:当然,市面上也有其他基于

本文目录

    Lua 这门语言天生就带着一股子机灵劲儿,它高度灵活,能在各种平台上跑,包括 Web 服务。说到 Lua 的 Web 生态,就不得不提 2004 年成立的 Kepler 社区,它贡献了整套开源的 Lua Web 组件。下面这张图就是 Lua 下基本的网络编程示例的直观展示:

    Lua下基本的网络编程示例

    当然,市面上也有其他基于 Lua 的 Web 框架,但 Kepler 社区提供的这套组件是绕不开的基石。咱们就把焦点放在它身上。

    应用程序和框架

    • Orbit:一个 Lua 的 MVC Web 框架,底层基于 WSAPI。
    • WSAPI:它是从 Lua Web 应用抽象出的 Web 主机服务器接口,很多项目都依赖它。
    • Xa vante:一个 Lua 写的 Web 服务器,提供了 WSAPI 接口。
    • Sputnik:一个基于 WSAPI 的 wiki/CMS 项目,最初是 Kepler 团队为了好玩搞出来的。
    • CGILua:曾经通过 WSAPI 提供 LuaPages 和 LuaScripts 的网页制作能力,但现在已停止维护。建议直接用 Orbit、Sputnik 或 WSAPI 代替。

    接下来,我们会一步步带大家熟悉 Lua Web 开发的安装和使用流程。更多细节可以查阅 Kepler 官网。

    Orbit

    Orbit 是 Lua 世界里一个相当清爽的 MVC Web 框架。它彻底离开了 CGILua 的老路子。每个 Orbit 应用可以像一个“脚本”文件那样运行(类似 CGILua 模式),但如果想拆成多个文件,也完全支持。

    所有的 Orbit 应用都遵循 WSAPI 协议,所以它们能跟 Xa vante、CGI 和 FastCGI 等后端无缝配合。它还自带一个启动器,可以快速拉起一个 Xa vante 实例用于开发调试。

    安装 Orbit 最省事的办法是用 LuaRocks。一句命令就能搞定:

    luarocks install orbit

    当然,前提是先装好 LuaRocks 本身。如果还没装好所有依赖,可以在 Unix/Linux 环境下按照下面的步骤来。

    安装 Apache

    先连上服务器,装上 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 和 Xa vante

    sudo luarocks install orbit
    sudo luarocks install wsapi-xa vante
    sudo luarocks install wsapi-fcgi

    配置 Apache2

    编辑 Apache 的站点配置文件:

    sudo raj /etc/apache2/sites-a vailable/default

    在 这部分里添加下面的内容。如果原来有“AllowOverride None”,记得把它改成“AllowOverride All”,这样 .htaccess 文件才能覆盖配置。

    
        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
    

    改完后重启 Apache 让配置生效:

    sudo /etc/init.d/apache2 force-reload

    为了让 Orbit 应用能够被正常访问,还需要在应用根目录(这里假设是 /var/www)的 .htaccess 文件中加上 +ExecCGI:

    Options +ExecCGI
    DirectoryIndex index.ws

    简单的例子 — Orbit

    下面是一个最基本的 Orbit 应用(文件名 index.lua):

    #!/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 [[
        
        
        

    First Page

    ]] end

    保存后,打开浏览器访问 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.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())

    更多细节可以翻翻 Orbit 的官方文档,那里有很长的教程。

    WSAPI

    前面提到过,WSAPI 是很多项目的底层支撑。它能跑在 Windows 和 Unix 系统上,支持 CGI、FastCGI 和 Xa vante 三种服务器/接口。

    WSAPI 自带大量的 Lua 库,让网络编程省心不少。它支持以下功能:

    • 请求处理(Request processing)
    • 输出缓冲(Output buffering)
    • 认证(Authentication)
    • 文件上传(File uploads)
    • 请求隔离(Request isolation)
    • 多路复用(Multiplexing)

    一个简单的 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("")
          coroutine.yield("

    Hello Wsapi!

    ") coroutine.yield("

    PATH_INFO: " .. wsapi_env.PATH_INFO .. "

    ") coroutine.yield("

    SCRIPT_NAME: " .. wsapi_env.SCRIPT_NAME .. "

    ") coroutine.yield("") end return 200, headers, coroutine.wrap(hello_text) end

    这里可以看到协程的用法——通过 coroutine.yield 逐段返回 HTML,最后返回状态码 200、响应头和一个协程包装的函数。

    Xa vante

    Xa vante 是一个基于 URI 模块化架构的 Lua HTTP Web 服务器(版本 1.1),通过映射处理器来处理请求。它目前提供了三种处理器:

    • 文件处理器(File handler)
    • 重定向处理器(Redirect handler)
    • WSAPI 处理器(WSAPI handler)

    文件处理器处理常规文件,重定向处理器负责 URI 重新映射,WSAPI 处理器则对接 WSAPI 应用。

    一个简单的 Xa vante 配置示例:

    require "xa vante.filehandler"
    require "xa vante.cgiluahandler"
    require "xa vante.redirecthandler"
    
    -- Define here where Xa vante HTTP documents scripts are located
    local webDir = XA VANTE_WEB
    
    local simplerules = {
    
        { -- URI remapping example
          match = "^[^%./]*/$",
          with = xa vante.redirecthandler,
          params = {"index.lp"}
        },
    
        { -- cgiluahandler example
          match = {"%.lp$", "%.lp/.*$", "%.lua$", "%.lua/.*$" },
          with = xa vante.cgiluahandler.makeHandler (webDir)
        },
        
        { -- filehandler example
          match = ".",
          with = xa vante.filehandler,
          params = {baseDir = webDir}
        },
    }
    
    xa vante.HTTP{
        server = {host = "*", port = 8080},
        
        defaultHost = {
            rules = simplerules
        },
    }

    如果要用虚拟主机,可以这样写:

    xa vante.HTTP{
        server = {host = "*", port = 8080},
        
        defaultHost = {},
        
        virtualhosts = {
            ["www.sitename.com"] = simplerules
        }
    }

    Lua Web 组件

    除了上面介绍的几个核心组件,Kepler 社区还提供了一些实用的辅助库:

    • Copas:基于协程的调度器,适合通过 TCP/IP 协议运行服务器。
    • Cosmo:一个“安全模板”引擎,能防止模板里混入任意代码。
    • Coxpcall:对 Lua 原生的 pcall 和 xpcall 的封装,让它们与协程兼容。
    • LuaFileSystem:可移植的底层目录结构和文件属性访问库。
    • Rings:允许在 Lua 内部创建新的 Lua 状态的库。

    其他可选的 Lua Web 框架

    Lua 的 Web 生态远不止这些。还有几个值得一提的框架:

    • Moonstalk:专注于高效开发和托管动态 Web 项目,从简单页面到复杂应用都能搞定。
    • Lapis:用 MoonScript(或 Lua)构建 Web 应用的框架,运行在 OpenResty(一个定制版的 Nginx)之上。
    • Lua Server Pages:一个 Lua 脚本引擎插件,嵌入到其他 Web 开发方式中,能大幅简化传统 C 服务器页面的开发。

    这些框架和组件共同构成了 Lua 在 Web 开发中的强大工具箱。根据项目需求灵活选型,就能发挥出 Lua 的独特优势。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    编程语言的编程模型
    编程语言的编程模型

    编程模型涵盖面向过程的C语言、面向对象的Ruby、基于栈的PostScript、基于规则的Prolog、基于原型的Lua、函数式的Erlang/Haskell及混合模型的Scala/Clojure。类型系统区分强类型与弱类型、动态类型与静态类型,元编程允许运行时操作代码,提升表达力。

    lua 如何获取指定路径下的所有文件夹
    lua 如何获取指定路径下的所有文件夹

    Lua编程语言轻量级且小巧,可用io.popen执行系统命令获取指定路径下所有文件夹:在Windows系统下使用dir/b/s命令,在Unix系统下使用find-typef命令。然而官方更推荐使用lfs库进行递归遍历,通过lfs.dir和lfs.attributes函数筛选目录,此法避免系统命令依赖,代码简洁且跨平台效果更佳。

    lua调用C/C++的方法详解
    lua调用C/C++的方法详解

    Lua通过虚拟栈与C/C++交互,将C函数封装为接口供其调用。调用时,C从栈中获取参数并返回结果,参数传递与结果返回均通过栈操作完成,从而实现了Lua对C能力的高效、便捷调用,使得Lua能无缝利用C语言的高性能库。

    详解Lua中的元表和元方法
    详解Lua中的元表和元方法

    一、元表 元表是Lua中一个挺有意思的机制——它允许我们在一个值遇到未知操作时,给出自定义的行为。本质上,元表也是用table来承载的,所以熟悉了table,也就掌握了元表的基本用法。 不过得注意,元表只能针对一组预先定义好的操作集合做扩展,比面向对象中的类要受限得多。最典型的一点:元表不支持继承。

    如何使用Vim搭建Lua开发环境详解
    如何使用Vim搭建Lua开发环境详解

    基于SpaceVim搭建Lua开发环境,需先安装Neovim、Nerd字体及支持真色的终端,启用lang#lua模块后,即可获得全面的代码补全、语法检查、工程文件跳转、一键运行、代码格式化及交互式编程等高效开发功能,大幅提升编程效率与体验。

    Luvit像Node.js一样写Lua应用
    Luvit像Node.js一样写Lua应用

    先问个问题:如果你是一个Lua开发者,手头刚好有异步I/O的需求,你会怎么办?传统方案当然有,但要说最接近Node.js体验的,还得是Luvit。简单来说,它就是Lua界的Node.js——把Lua和libUV撮合在一起,再加上JIT加持,用项目自己的话说:Lua + libUV + JIT = p

    Lua流程控制语句if else的使用示例
    Lua流程控制语句if else的使用示例

    Lua的流程控制,if和if else是基础。和C语言很像,if语句支持嵌套,也能和循环配合——比如在循环体内根据条件决定是否跳出,这在日常开发中非常实用。 1、if语句 先看最基本的if语法结构: if(布尔表达式) then --[ 在布尔表达式为 true 时执行的语句 --] end 来看一

    Lua中pairs与ipairs的区别总结
    Lua中pairs与ipairs的区别总结

    最近在写一个流量转发的东西,用到了 nginx_lua_module 这个模块,需要根据 Header、Body 和 Cookie,按照流量比例把请求转发到其他地方。翻看前人留下的代码,发现循环遍历时,有时候用 pairs,有时候用 ipairs,风格并不统一,读起来让人有点困惑。 好在 Lua 官

    Lua游戏开发教程之时区问题详解
    Lua游戏开发教程之时区问题详解

    通过Lua的os.date("!*t")获取UTC时间,结合服务器时区差值,可将游戏内时间统一显示为服务器所在地时间。计算活动倒计时时,需考虑本地时区与服务器时区的差异,转换时间戳后得到准确剩余时间。正确处理时区问题能解决多语种发行中的显示同步难题。

    深入谈谈lua中神奇的table
    深入谈谈lua中神奇的table

    Lua中的table可作为字典、数组、环境、模块、对象和类使用。字典支持任意非nil键类型,遍历无序;数组索引从1开始,#对空洞处理需谨慎。table掌管全局环境_G和局部环境_ENV,模块本质为table。对象通过闭包实现私有成员,冒号语法糖简化self传递;类借助元表__index实现继承。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。