ua是一门脚本动态语言,并不太适合做复杂业务逻辑的程序开发,但是,在高并发场景下,Nginx Lua编程是解决性能问题的利器。
Nginx Lua编程主要的应用场景如下:
ngx_lua是Nginx的一个扩展模块,将Lua VM嵌入Nginx,请求时创建一个VM,请求结束时回收VM,这样就可以在Nginx内部运行Lua脚本,使得Nginx变成一个Web容器。以OpenResty为例,其提供了一些常用的ngx_lua开发模块:
Lua脚本需要通过Lua解释器来解释执行,除了Lua官方的默认解释器外,目前使用广泛的Lua解释器叫做LuaJIT。LuaJIT采用C语言编写,被设计成全兼容标准Lua 5.1,因此LuaJIT代码的语法和标准Lua的语法没多大区别。但是LuaJIT的运行速度比标准Lua快数十倍。
在OpenResty中,每个Worker进程使用一个Lua VM,当请求被分配到Worker时,将在这个Lua VM中创建一个协程,协程之间数据隔离,每个协程都具有独立的全局变量。
ngx_lua是将Lua VM嵌入Nginx,让Nginx执行Lua脚本,并且高并发、非阻塞地处理各种请求。Lua内置协程可以很好地将异步回调转换成顺序调用的形式。ngx_lua在Lua中进行的IO操作都会委托给Nginx的事件模型,从而实现非阻塞调用。开发者可以采用串行的方式编写程序,ngx_lua会在进行阻塞的IO操作时自动中断,保存上下文,然后将IO操作委托给Nginx事件处理机制,在IO操作完成后,ngx_lua会恢复上下文,程序继续执行,这些操作对用户程序都是透明的。
每个Worker进程都持有一个Lua解释器或LuaJIT实例,被这个Worker处理的所有请求共享这个实例。每个请求的context上下文会被Lua轻量级的协程分隔,从而保证每个请求是独立的。
ngx_lua采用one-coroutine-per-request的处理模型,对于每个用户请求,ngx_lua会唤醒一个协程用于执行用户代码处理请求,当请求处理完成后,这个协程会被销毁。每个协程都有一个独立的全局环境,继承于全局共享的、只读的公共数据。所以,被用户代码注入全局空间的任何变量都不会影响其他请求的处理,并且这些变量在请求处理完成后会被释放,这样就保证所有的用户代码都运行在一个sandbox(沙箱)中,这个沙箱与请求具有相同的生命周期。
得益于Lua协程的支持,ngx_lua在处理10000个并发请求时,只需要很少的内存。根据测试,ngx_lua处理每个请求只需要2KB的内存,如果使用LuaJIT就会更少。
ngx_lua定义的Nginx配置指令大致如下:
ngx_lua配置指令在Nginx的HTTP请求处理阶段所处的位置如图:
http {
...
#设置“.lua”外部库的搜索路径,此指令的上下文为http配置块
#";;"常用于表示原始的搜索路径
lua_package_path "/foo/bar/?.lua;/blah/?.lua;;";
lua_package_cpath "/usr/local/openresty/lualib/?/?.so;/usr/local/openresty/lualib/?.so;;";
}
对于以上两个指令,OpenResty可以在搜索路径中使用插值变量。例如,可以使用插值变量$prefix或${prefix}获取虚拟服务器server的前缀路径,server的前缀路径通常在Nginx服务器启动时通过-p PATH命令在指定。
格式为:init_by_lua lua-script-str。
格式为:lua_code_cache on | off
http {
...
#项目初始化
init_by_lua_file conf/luaScript/initial/loading_config.lua;
#调试模式,关闭lua脚本缓存
lua_code_cache on;
...
}
在缓存关闭的时,set_by_lua_file、content_by_lua_file、access_by_lua_file、content_by_lua_file等指令中引用的Lua脚本都将不会被缓存,所有的Lua脚本都将从头开始加载。
格式为:set_by_lua $destVar lua-script-str params
location /set_by_lua_demo {
#set 指令定义两个Nginx变量
set $foo 1;
set $bar 2;
#调用Lua内联代码,将结果放入Nginx变量$sum
#Lua脚本的含义是,将两个输入参数$foo、$bar累积起来,然后相加的结果设置Nginx变量$sum中
set_by_lua $sum 'return tonumber(ngx.arg[1]) + tonumber(ngx.arg[2])' $foo $bar;
echo "$foo + $bar = $sum";
}
运行结果:
➜ work curl http://localhost/set_by_lua_demo
1 + 2 = 3
格式为:access_by_lua $destVar lua-script-str
location /access_demo {
access_by_lua 'ngx.log(ngx.DEBUG, "remote_addr = "..ngx.var.remote_addr);
if ngx.var.remote_addr == "192.168.56.121" then
return;
end
ngx.exit(ngx.HTTP_UNAUTHORIZED);
';
echo "hello world";
}
location /access_demo_2 {
allow "192.168.56.121";
deny all;
echo "hello world";
}
运行结果:
➜ work curl http://localhost/access_demo
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>openresty/1.13.6.2</center>
</body>
</html>
#上述案例运行日志:
2022/02/15 10:32:17 [debug] 26293#0: *17 [lua] access_by_lua(nginx-lua-demo.conf:85):1: remote_addr = 127.0.0.1
2022/02/15 10:32:17 [info] 26293#0: *17 kevent() reported that client 127.0.0.1 closed keepalive connection
➜ work curl http://localhost/access_demo_2
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>openresty/1.13.6.2</center>
</body>
</html>
#上述案例运行日志
2022/02/15 10:33:11 [error] 26293#0: *18 access forbidden by rule, client: 127.0.0.1, server: localhost, request: "GET /access_demo_2 HTTP/1.1", host: "localhost"
2022/02/15 10:33:11 [info] 26293#0: *18 kevent() reported that client 127.0.0.1 closed keepalive connection
格式为:content_by_lua lua-script-str
location /errorLog {
content_by_lua '
ngx.log(ngx.ERR, "this is an error log ");
ngx.say("错误日志调用成功");
';
}
location /infoLog {
content_by_lua '
ngx.log(ngx.ERR, "this is an info log ");
ngx.say("业务日志调用成功");
';
}
location /debugLog {
content_by_lua '
ngx.log(ngx.ERR, "this is an debug log ");
ngx.say("调试日志调用成功");
';
}
OpenResty v0.9.17版本以后,使用content_by_lua_block指令代替content_by_lua指令,避免对代码块中的字符串进行转译。
运行结果:
➜ work curl http://localhost/errorLog
错误日志调用成功
➜ work curl http://localhost/infoLog
业务日志调用成功
➜ work curl http://localhost/debugLog
调试日志调用成功
内置变量
内置常量
内置常量基本是见名知意的,可以根据后面的实战案例,加深理解。
核心常量
HTTP方法常量
HTTP状态码常量
日志类型常量
Nginx+LUA基础到此结束,下一篇开始实战!并在实战中掌握基础。
Lapis是一个为Lua语言设计的Web应用开发框架,它主要针对OpenResty,这是一个基于Nginx的高性能Web平台。Lapis不仅提供了一个简洁而强大的API来构建Web服务,还支持现代Web开发中的多种需求,包括路由、模板、数据库集成、安全性等。
Lapis利用OpenResty的强大性能,通过LuaJIT在Nginx内部运行Lua代码,实现了高性能的处理能力。这意味着开发者可以享受到接近C语言级别的执行效率,同时保持Lua语言的简洁性和灵活性。
Lapis支持Lua协程,允许开发者编写看起来是同步的代码,但实际上是异步执行的。这种方式可以显著提高应用程序的并发处理能力,同时避免了回调地狱,使代码更加清晰易读。
Lapis提供了一个灵活的路由系统,允许开发者定义各种URL模式,并将其映射到相应的处理函数。这使得URL的设计和处理变得简单而直观。
Lapis内置了HTML模板系统,支持etlua模板语言,允许开发者以一种声明式的方式编写HTML页面。此外,Lapis的模板系统还提供了HTML构建器语法,使得HTML的生成既安全又便捷。
Lapis支持PostgreSQL、MySQL和SQLite等多种数据库,提供了一个强大的模型层抽象,使得数据库操作变得简单。开发者可以通过继承Model类来创建自己的数据库模型,并轻松地进行数据的增删改查操作。
Lapis提供了CSRF保护和会话支持,帮助开发者构建更安全的Web应用。通过内置的安全特性,可以有效地防止跨站请求伪造等常见的Web安全威胁。
local lapis = require "lapis"
local app = lapis.Application()
app:match("/", function(self)
return "Hello world!"
end)
return app
app:match("/profile/:username", function(self)
local username = self.params.username
return "Welcome, " .. username .. "!"
end)
local lapis = require "lapis"
local app = lapis.Application()
class extends lapis.Application
"/": =>
"Hello world!"
["/profile/:username"]: =>
local username = @params.username
"Welcome, " .. username .. "!"
return app
local Model = require("lapis.db.model").Model
class Users extends Model
local app = lapis.Application()
app:get("/users", function(self)
local users = Users:select("*")
return { render = true, users = users }
end)
return app
local lapis = require "lapis"
local app = lapis.Application()
app:match("/", function(self)
return self:render("index")
end)
return app
Lapis是一个功能强大且高效的Web开发框架,它结合了Lua语言的灵活性和OpenResty的性能优势。无论是构建简单的Web服务还是复杂的Web应用,Lapis都是一个值得考虑的选择。随着社区的不断壮大和生态系统的完善,Lapis有望成为Lua Web开发领域的重要力量。
App Game Kit
The Game Creators出品
支持平台:Windows,Linux, Mac OSX, iOS, Android, web browser, Raspberry Pi, SteamVR
语言:C++、AppGameKit Script
App Game Kit简单易用易学习的2D/3D游戏开发工具包,拥有完整的游戏引擎功能,可快速建立内容发布到移动平台,极适合个人、兴趣、学校教育方面使用。
特点:轻量化、更新极快速、多平台编辑器支持
授权:一次性支付.99,免版权费分成。一些扩充功能包另外购买。
Game Blender
BlenderFoundation维护
支持平台:Windows, Mac OSX, Linux
语言:Python
Blender是一款免费开源的3D内容创作套件。包括建模、uv展开、材质绘制、动画制作、合成、流体/烟雾、粒子、渲染系统等功能,也包含一个游戏引擎。Game Blender有图形逻辑编辑器,可定义交互行为而无须编程,也拥有各种引擎基本功能,订制、扩充能力极强。
特点:开源、更新极快速、真正的Allin One、强大的扩展性、多平台编辑器支持。
授权:GPL3许可证。
CopperCube 5
Ambiera出品
支持平台:Windows,Mac OSX, web browser, Android, Flash
语言:C++,Javascript
CopperCube一款简易但完整的游戏引擎,拥有完整的编辑工具以及游戏预设,可以利用内建的功能建模并完成一款简单的游戏,或是快速制作大型游戏的原型用以评估项目。
特点:快速上手、普通更新速度、支持中文。
授权:一次性支付.99,免版权费分成。
外加9.99,获得一些额外功能,获得完整C++原码。
CryEngine V
Crytek公司出品
支持平台:Windows,Linux, PlayStation 4, Xbox One, Oculus Rift, HTC Vive, OSVR 与 PlayStation VR
语言:C++、C#、Schematyc
CryEngine V是一套完整强大的游戏开发工具,拥有明确的工具体系,以及完成一款大型游戏的完善功能。 拥有极其优化的代码和高度整合的后期处理效果,能在性能与画面呈现上取得极佳的平衡效果。
特点:完整的开发生态链、更新快速、完全免费、稳定的大型场景乘载。
授权:任何平台在游戏及影视领域使用免使用费,免版权费。可在任何阶段选择性支付任何价格(PayWhat You Want授权)。
Esenthel Engine
Esenthel/Grzegorz Slazinski出品
支持平台:Windows,Windows Phone, Xbox, Mac OS, iOS, Android, Linux, Web
语言:C++
Esenthel是一款功能完整的商业游戏引擎,拥有多平台部属及完整的多人联机特性。
特点:完整工具链、普通更新速度、带原码的多人模板、多平台编辑器支持。
授权:免费试用。高级功能订阅每月.40或每年4。完整原码每年订阅8。
Game Guru
The Game Creators出品
支持平台:Windows
语言:Lua
Game Guru是一款简易的游戏引擎,拥有完整的编辑工具以及游戏预设,可以利用内建的功能完成一款简单的游戏。能购买AppGame Kit的扩充包将两者整合。
特点:快速上手、更新较快、内置游戏模块。
授权:一次性支付.99,免版权费抽成。
Gamestudio
Conitec Datasystems出品
支持平台:Windows
语言:C++、C#、Delphi、Lite-C
Gamestudio或称3D Gamestudio是一款老牌的游戏引擎,包含完整的渲染、优化、粒子、物理碰撞、2D引擎、音效引擎、网络、和游戏模块等等,可以应用于各种游戏、应用程序创建。
特点:完整的工具链和SDK、缓慢的更新速度、稳定、强大的可扩充性、拥有庞大的小区贡献和帮助。
授权:免费版,免版权费分成,需开源自己的原码/脚本。
加强版,一次性支付,功能同免费版,外加打包、编译、加密功能,以及插件/引擎SDK。
商业版,一次性支付9,拥有中大型规模游戏所需大部分功能。
专业版,一次性支付9,拥有大型游戏所需所有功能。
Hero Engine
IdeaFabrik出品
支持平台:Windows
语言:C++,C#, HeroScript Language
Hero Engine是一套拥有完整开发链的游戏开发工具,虽然各种游戏皆能开发,但对于客路端和服务器架构皆集成到开发流程中,是非常适合用来开发MMO的游戏引擎。
特点:完整的开发生态链、更新快速、超大场景建立、网络游戏特化、百人以上开发团队在线协作解决方案、官方服务器建设解决方案,大幅节省开发成本支出。
授权:免费方案,免费使用引擎。
入门方案,每年.95,两名使用者,可于测试阶段免费使用官方服务器资源,可于官方平台免费使用Awesomium、RAD Game Tools、SpeedTree、DPVS Umbra、FMOD、FaceGen等第三方软件和插件。
基本、标准、专业、高级方案个别为每年9.95、9.95、9.95、9.95,对应5、15、50、100名使用者。
终生方案95.95,300名使用者,包含源码折扣。
订阅入门以上方案在Alpha、Beta、最终release阶段可由官方协助寻找、架设服务器,此阶段由官方吸收成本,最终上线后收入分成30%。
jMonkey Game Engine
The jME Core团队出品
支持平台:Windows,OSX, Linux, Android, iOS, Oculus Rift
语言:Java
jMonkeyEngine是一款基于Java开发的游戏引擎,拥有跨平台、易学的特性,可以在任何支持的IDE环境下开发,只要拥有Java技能就能够开发任何一种3D游戏。
特点:开源、更新较慢、跨平台。
授权:BSD许可证
Leadwerks
Leadwerks公司出品
支持平台:Windows,Linux, SteamOS, HTC Vive, Oculus Rift, OSVR
语言:C++、Lua、Flowgraph
Leadwerks是一个基于OpenGL,3D的游戏引擎。 它具有延迟照明系统,屏幕空间环境遮挡,模拟实时全局照明,高级着色器,支持巨大的地形,新的植被系统,内置的UI设计工具,集成的LUA脚本编辑器等等。
特点:轻量化、普通更新速度、高度订制化、社群活跃、多平台编辑器支持。
授权:一次性支付.99,免版权费。C++原代码另外加.99
Lumberyard
Amazone出品
支持平台:Windows,Xbox One, PlayStation, iOS, Android, Oculus Rift, HTC Vive, OSVR, PlayStationVR
语言:C++、Lua、Flowgraph
Lumberyard是Amazone公司基于CryEngine 3与自家Amazon Web Services平台开发的免费跨平台游戏引擎,拥有CryEngine 3大部分的图形技术外,其重构了引擎的网络代码,能够轻易集成AWS服务做到大小规模在线游戏。
特点:完整的开发生态链、更新较快、稳定的大型场景乘载、网络游戏特化。
授权:免费使用,免版权费分成。若无自己的网络设备,限制仅能集成、租用AWS网络服务。
Neoaxis
NeoAxis Group Ltd公司出品
支持平台:Windows,Mac OSX
語言:C#
拥有开发游戏的完整功能,内置physX,内置网络支持和寻路组件,内置UI系统。拥有功能完善的SDK、资源导入流程。
特点:轻量、功能完整、更新较慢。
授权:SDK免费使用,免版权费抽成。专业授权每人5,获得编辑器、资源导入、定型、对象、网络等代码。完整授权每人95,获得所有引擎代码。
Panda 3D/ RenderPipeline
Carnegie Mellon University
支持平台:Windows,Mac OSX, Linux, FreeBSD
语言:C++、Python
Panda3D是一款开源的游戏/渲染引擎,包括有物理、粒子、GUI、AI、高级着色器等特性。RenderPipeline为Panda3D的延伸项目,为引擎导入了PBR渲染、延迟渲染、高级后处理特效、TOD系统、插件系统等。
特点:开源项目、普通更新速度、WaltDisney Imagineering加持。
授权:订制的BSD许可证。
S2Engine HD
Profenix Studio, Fabio Di Paola个人出品
支持平台:Windows
语言:C++,GameMachine, S2Engine HD script
S2Engine HD为一款由个人制作/维护的游戏引擎,拥有整合好的高级画面效果处理系统、类C的脚本语言、可视化脚本/编程模块、音频、物理、UI编辑器等,可以快速制作出美观的游戏。
特点:快速上手、普通更新速度、完整的游戏制作流程、对中型以上团队较不友善。
授权:一次性支付.99,免版权费分成。
Serious Engine
Croteam出品
支持平台:Windows,Xbox, Linux, Mac OSX
语言:C++
Serious Engine目前最高版本为Serious Engine 4,可创建大型开放世界,渲染大量敌人,拥有逼真的后处理效果。其开源版本为1.10,可取得UI工具、建模工具、完整的游戏引擎原码和编译工具。
特点:开源、停止更新
授权:GPL-2.0许可证。
Shive3D
ShiVaTech出品
支持平台:Windows,Mac OSX, Linux, Android, Blackberry, iOS, PlayStation 4, PlayStation3, Xbox360, Xbox One, Vita, Wii, Windows Phone, 网页浏览器
语言:C++、Lua
Shive3D是拥有完整生态及工具链的一款引擎,对移动设备支持较好,曾经是移动设备游戏的首选引擎之一。近年来由于引擎老化创新不足,用户已大幅流失,但仍不失为一个轻便好用的引擎。
特点:轻量化、缓慢更新速度、移动设备支持良好。
授权:Web版可使用所有编辑器功能,可部属到网页,免版权费,锁定部分引擎特性。
Basic版一次性支付0,可部属到所有平台,其余限制与Web版相同。
Advanced版一次性支付00,可使用所有高级功能。
Source Engine/Source SDK
Valve公司出品
支持平台:Windows,macOS, Linux, Android
语言:C++(底层)、Squirrel
历久弥新的一款引擎/模块编辑器,拥有许多模块及小区资源。
特点:老经典
授权:免费,拥有任一款Source引擎开发的游戏即可使用。
Stingray
Autodesk出品
支持平台:Windows,PlayStation, Xbox, Android, iOS, Oculus Rift, HTC Vive, OSVR, Playstation VR
语言:Lua
Stingray为一款与Autodesk建模及IBM软件高度集成的游戏/渲染引擎,并完美整合旗下的AutodeskGameware产品线,以及得益于数度重构而拥有干净整齐的底层模块,适合程序从头建立游戏/应用程序内容。
特点:干净、普通更新速度、与Autodesk建模工具景密结合、快速建立每诉内容、快速建立动画内容。
授权:每月或每年0,与Maya LT捆绑订阅,免版权费抽成。
源码另议。
Tombstone Engine (C4Engine)
Terathon Software公司出品
支持平台:PlayStation4, Windows, Mac OSX, Linux, iOS
语言:C++、OpenDDL、视觉脚本编辑器
Tombstone Engin是功能完整,开发速度快的游戏引擎,以前的C4引擎。拥有完整SDK、素材导入、UI编辑器、脚本编辑器等,可快速开发出可玩的FPS游戏。
特点:恐怖游戏特化、普通更新速度
授权:单一授权,一次性支付5,包含完整原码、工具、示例游戏,无游戏、软件数量限制,无版权费抽成。
Torque3D
GarageGames公司出品
支持平台:Windows,Mac OSX, Linux
语言:C++
Torque是一款老牌的开放原始码引擎,集Collada、PhysX等库,拥有完整的生态链,稳定、易于扩充。
特点:老牌、开源、更新慢。
授权:MIT许可证。
Unigine 2
支持平台:Windows,Mac OSX, Linux, Oculus Rift, HTC Vive, OSVR
语言:C++、C#、UnigineScript
Unigine为一款实时的3D互动解决方案,拥有适合中小型团队制作游戏/应用程序的版本,以及仿真特化的高级版本,可以做到星球级别的大地形、大气海洋模拟等,在专业应用、教育训练、影视等产业拥有极高的优势。
特点:专业应用、更新较快、较多的官方示范模板
授权:基础单人,一次性支付95,免版权费分成。基础团队,一次性支付95,最多十人。
专业版按座位定价。
仿真版按需求定价。
Unity 5
Unity Technologies公司出品
支持平台:Windows,Mac OSX, Linus, Android, BlackBerry, iOS, PlayStation 3, PlayStation 4,PlayStation Vita, Unity Web Player, Wii, Wii U, Windows Phone 8, Xbox 360, XboxOne还有其他以前的和未来的所有平台
语言:C#、C++(底层)、UnityScript(JavaScript)
家喻户晓,拥有世界上最大的开发链和社群、用户、资源,不知道自己想做什么时第一个上手。
特点:完整的开发生态链、更新极快速、世界最多人使用以及与这个称号相应的海量资源、移动设备支持良好、多平台编辑器支持。
授权:个人或小公司限制版本免费,收入需低于0,000
Plus版拥有完整功能,每人每月订阅,收入需低于0,000
Pro版拥有完整功能,每人每月订阅5,无限制使用。
Unreal Engine 4
Epic Games公司出品
支持平台:Windows,macOS, Linux, SteamOS, HTML5, iOS, Android, Nintendo Switch, PlayStation 4,Xbox One 与virtual reality (包含但不限于SteamVR/HTCVive, Oculus Rift, PlayStation VR, Google Daydream, OSVR 与 Samsung Gear VR)
语言:C++、Blueprint
Unreal Engine 4是一套完整强大的游戏开发工具,拥有明确的工具体系,以及完成一款大型游戏的完善功能。 拥有令人屏息的画面以及极度灵活的脚本系统。从2D手机游戏到游戏机台到VR,UE4为您提供开始,创建和发布游戏所需的一切。
特点:完整的开发生态链、更新极快速、拥有庞大的小区贡献和错误修复、拥有庞大的市场和教学资源、稳定的大型场景乘载、多平台编辑器支持。
授权:免费使用,在游戏或程序推送以后,每个季度收入达到,000以后须支付总收入的5%予Epic公司。
Wave Engine 2
Wave Engine团队维护
支持平台:Windows,Linux, Mac OSX, SteamOS, Xbox, iOS, Android, Oculus Rift, Hololens
语言:C#
Wave engine是一款基于.NET的开源跨平台2D/3D游戏开发工具,内置有各种游戏所需的完整模块,以及活泼的开发者社群,能够获得各种资源及解决问题。
特点:开源、更新较快、容易学习
授权:订制的开源授权,唯一限制为所开发产品激活时需标明Wave标志。
千万记得,承载游戏的是引擎,但完成游戏的是人的手。
记得关注小编哦
文章来源引擎世界网。
作者:我叫大春天。
*请认真填写需求信息,我们会在24小时内与您取得联系。