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,而没有通过连接池的形式,其实完全可以使用连接池的形式,只不过此处为了说明原理,采用了直连的形式。

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

Nginx+Lua+MySQL/Redis实现高性能动态网页展现的更多相关文章

  1. nginx lua mysql redis设置

    最近公司网站改版,程序和数据库全部用新版,旧版的数据要导入,旧网站的30万条数据url要全部重定向到新版网站,正好前段时间在学习nginx+lua+mysql+memcache(redis),找资料真 ...

  2. 使用Nginx Lua实现redis高性能http接口

    使用Nginx Lua实现redis高性能http接口 时间 -- :: 峰云就她了 原文 http://xiaorui.cc/2015/01/27/使用nginx-lua实现redis高性能http ...

  3. 从docker到docker-compose部署一个nginx+flask+mysql+redis应用

    目的是把一个flask项目的mysql数据库.redis数据库.flask应用.nginx服务分别装到四个容器中,然后用docker-compose命令同时启动与关闭 一.安装docker Docke ...

  4. 基于nginx + lua实现的反向代理动态更新

    大家都知道,nginx是当前应用非常广泛的web服务器,热度因为他的高并发高性能高可靠性,且轻量级!牛逼的不行,不多说这些. 今天要介绍的是,如何基于nginx和lua脚本,也就是在openresty ...

  5. Nginx+Php-fpm+MySQL+Redis源代码编译安装指南

    说明:本教程主要包括以下三个部分: 1. 源代码编译安装Nginx 2. 源代码编译安装php以及mysql.redis扩展模块 3. 配置虚拟主机 文中所涉及安装包程序均提供下载链接,欢迎使用 运行 ...

  6. Nginx+Php-fpm+MySQL+Redis源码编译安装指南

    说明:本教程由三部分组成如下: 1.      源码编译安装Nginx 2.      源码编译安装php以及mysql.redis扩展模块 3.      配置虚拟主机 文中所涉及安装包程序均提供下 ...

  7. windows本地搭建nginx+php+mysql+redis环境详细步骤

    1.mysql的下载和安装 这个可参考我另外一篇文章:http://www.cnblogs.com/myIvan/p/9265645.html 2.php的下载和配置修改 下载地址:https://w ...

  8. ubuntu18.04+gunicorn+nginx+supervisor+mysql+redis安装django项目

    Ubuntu18.04 install Django project 项目准备: ECS 实例 (云服务器) 此安装部署方案适合本地ubuntu18.04系统安装和虚拟机中ubuntu18.04系统安 ...

  9. [nginx]lua操作redis

    local redis = require "resty.redis" local red = redis:new() red:set_timeout() -- sec -- or ...

随机推荐

  1. Win8 Metro(C#)数字图像处理--2.39二值图像投影

    原文:Win8 Metro(C#)数字图像处理--2.39二值图像投影  [函数名称]   二值图像投影         ImageProjection(WriteableBitmap src) ...

  2. SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC)

    原文:SqlServer & Windows 可更新订阅立即更新启用分布式事务协调器(MSDTC) 在可更新订阅中,在订阅设置更新方法,将 "排队更新" 设置为 " ...

  3. Oracle配置OneMap中的sql数据库问题及解决方案

    报错ORA-00900:无效SQL语句,点确定后报错:ORA--00942:表或视图不存在 分析:prompt在Oracle中是打印功能,如果要在PLsql中执行带有prompt的sql文件就会报上面 ...

  4. Hadoop中重要概念简要总结

    Hadoop是一个利用大规模计算机集群,可处理大量数据的分布式并行框架. Hadoop 官网 Hadoop的核心设计包括HDFS和MapReduce. HDFS HDFS(Hadoop Distrib ...

  5. Delphi获得一个进程的主窗体(GetWindow(AHandle, GW_OWNER)等于0的窗体才是主窗体,并且要IsWindowVisible排除Application窗口)

    type  TMainWindow = packed record    ProcessID: THandle;    MainWindow: THandle;  end;  PMainWindow  ...

  6. 如何在 Xcode 中进行 Qt 开发(可使用使用 Homebrew 来安装qt)

    第一步 安装 Qt 分为两种情况: 1. 希望使用 Qt Quick 等先进Qt5技术, 2. 只需要 Qt 4.8的类库即可. 第一种, 直接去官网下载 Mac安装包, 在此不作过多说明, 开发时也 ...

  7. Android无布局文件下自定义通知栏notification的 icon

    在开发项目一个与通知栏有关的功能时,由于自己的项目是基于插件形式的所以无法引入系统可用的布局文件,这样无法自定义布局,造成无法自定义通知栏的icon. 在网上也有一种不用布局文件更换icon的方法,但 ...

  8. ASP.NET Core 通过 Microsoft.DotNet.Watcher.Tools 实现热部署

    之前开发前端的时候,webpack 会有热更新工具,在修改了代码之后,自动将代码编译,实时展现到页面上,给开发带来了极大的方便. Java也可以通过第三方插件JRebel实现热部署,不用频繁的重启To ...

  9. 再谈Delphi关机消息拦截 -- 之控制台程序 SetConsoleCtrlHandler(控制台使用回调函数拦截,比较有意思)

    这里补充一下第一篇文章中提到的拦截关机消息 Delphi消息拦截:http://blog.csdn.net/cwpoint/archive/2011/04/05/6302314.aspx 下面我再介绍 ...

  10. 条款16:成对使用new和delete时要使用相同的形式

    请牢记: 如果在new表达式中使用[],必须在相应的delete表达式中也使用[]. new[]  对应  delete[] 如歌在new表达式中不适用[],一定不要在相应的delete表达式中使用[ ...