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

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

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.  

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

  13. if not db then

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

  15.    return

  16. end

  17.  

  18. db:set_timeout(1000)

  19.  

  20. local props = {

  21.    host = "192.168.1.104",

  22.    port = 3306,

  23.    database = "sonar",

  24.    user = "root",

  25.    password = "root"

  26. }

  27.  

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

  29.  

  30. if not res then

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

  32.   return close_db(db)

  33. end

  34.  

  35. local select_sql = "select * from dashboards"

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

  37. if not res then

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

  39.   return close_db(db)

  40. end

  41.  

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

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

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

  45.   end  

  46. end  

  47.  

  48. close_db(db)

Lua-template 模板技术

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

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

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

  3.  

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

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

  6. 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.  

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

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

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

歪脖贰点零  ∣ 迭代当下 · 架构未来Nginx+Lua+MySQL/Redis实现高性能动态网页展现_网页_02Nginx+Lua+MySQL/Redis实现高性能动态网页展现_网页_03程序员,除了编码,生活还应该有沉淀!