• Nginx+Lua+MySQL/Redis实现高性能动态网页展现


    Nginx结合Lua脚本,直接绕过Tomcat应用服务器,连接MySQL/Redis直接获取数据,再结合Lua中Template组件,直接写入动态数据,渲染成页面,响应前端,一次请求响应过程结束。最终达到下图的一个效果。

    OpenResty组件

    OpenResty的自带组件库默认已经集成了相当实用的组件,http://openresty.org/cn/components.html,如下所示:

    • LuaCjsonLibrary

    • LuaRestyMemcachedLibrary

    • LuaRestyMySQLLibrary

    • LuaRestyRedisLibrary

    • LuaRestyWebSocketLibrary

    • LuaRestyLimitTrafficLibrary

    • 其它等等

    Lua-mysql 连接mysql

    Lua直接连接MySQL的代码,再结全上一篇中连接Redis的代码,可以完成从后端动态的索取数据。

    1. --测试连接mysql,获取数据

    2. local function close_db(db)

    3.    if not db then

    4.        return

    5.    end

    6.    db:close()

    7. end

    8. //引入mysql组件

    9. local mysql = require("resty.mysql")

    10. local json = require("dkjson")

    11. local db, err = mysql:new()

    12. if not db then

    13.    ngx.say("error : ", err)

    14.    return

    15. end

    16. db:set_timeout(1000)

    17. local props = {

    18.    host = "192.168.1.104",

    19.    port = 3306,

    20.    database = "sonar",

    21.    user = "root",

    22.    password = "root"

    23. }

    24. local res, err, errno, sqlstate = db:connect(props)

    25. if not res then

    26.   ngx.say("connect error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)

    27.   return close_db(db)

    28. end

    29. local select_sql = "select * from dashboards"

    30. res, err, errno, sqlstate = db:query(select_sql)

    31. if not res then

    32.   ngx.say("select error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)

    33.   return close_db(db)

    34. end

    35. for i, row in ipairs(res) do  

    36.   for name, value in pairs(row) do  

    37.     ngx.say("select row =", i, " : ", name, " = ", value, "<br/>")  

    38.   end  

    39. end  

    40. close_db(db)

    Lua-template 模板技术

    通过Lua从后端动态取数,需要将数据渲染到静态页面,此时需要引入Template组件,该组件已经在OpenResty中引入,所以勿须再次安装,直接使用即可。

    1. --测试template组件,填充一些变量数据

    2. local template = require("resty.template")

    3. local context = {who = "guooo",from="usgrouping",jsons= {aaaa=123,bbbbb=23234}}  

    4. //此处可调用mysql/redis,一同将数据写入template3.html文件中

    5. template.render("template3.html", context)

    再看下静态页面模板长什么样:

    1. {(header.html)}  

    2. <!doctype html>

    3. <html lang="en">

    4. <head>

    5.  <meta charset="UTF-8">

    6.  <meta name="Generator" content="EditPlus®">

    7.  <meta name="Author" content="usgrouping">

    8.  <meta name="Keywords" content="usgrouping,guooo">

    9.  <title>lua-template test</title>

    10. </head>

    11. <body>

    12.   <div>你好{{who}},this is template page 3</div>

    13.  <br/>

    14.   <div>欢迎关注公众号:{{from}}</div>

    15.    <br/>

    16.    <br/>

    17.      {{jsons}}

    18. </body>

    19. </html>

    20. {(footer.html)}  

    21. 其中header.html及footer.html是常用的头部和底部文件,这里只是简单的文本展示

    经过上面的两大步,基本上就完成了动态数据经由Lua直接处理渲染成静态页面响应给前端,大大提高了执行效率。

    有同学看了上一篇的例子,同时结合Lua连接mysql的例子发现,都是直接连接mysql/redis,而没有通过连接池的形式,其实完全可以使用连接池的形式,只不过此处为了说明原理,采用了直连的形式。

    》》》点击左下方的原文链接获取源码及相关资料。

    成长的乐趣,在于分享!
    大龄程序员,一路走来,感慨颇多。闲暇时写写字,希望能给同行人一点帮助。
    本文版权归作者growithus和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    ArcGIS三种方式打断相交线------Feature To Line工具
    ArcGIS三种方式打断相交线------Planarize Lines工具
    3种方法快速制作tpk文件 [转]
    将oracle冷备份恢复到另外一个数据库实例中
    常用ArcGIS for Silverlight 开发API介绍
    Bear + Reminders 是完美的Thing 3 的替代品
    2019科技盛会汇总
    电子产品使用感受之——为什么我把Apple Watch S2 升级到了 S4?
    我了解到的新知识之——电热水器用电安全
    我了解到的新知识之----遇到路由器DNS被篡改我该怎么办?
  • 原文地址:https://www.cnblogs.com/growithus/p/11012201.html
Copyright © 2020-2023  润新知