openresty 页面静态化及多级缓存

多级缓存:

  • 数据缓存的好处不用介绍了吧!,
    所谓多级缓存,即在整个系统架构的不同系统层级进行数据缓存,以提升访问效率,这也是应用最广的方案之一。
  • 而 nginx 是可以缓存数据的,缓存在内存中,提高程序性能!
    程序中可以做缓存的技术有很多,加在以前就叫 多级缓存 而且不同的缓存技术存在,在不同的地方..实现不同的功能!
  • 目前我所知道可以做缓存的有:
    nginx —— Elasticearch —— redis —— @Ehcache JVM缓存 —— mybatis也有二级缓存!太强了!
    当然本章并不会讲解这么多,而是抽出几个来: nginx redis @Ehcache JVM缓存

页面静态化 模板渲染

  • 动态web网页开发是Web开发中一个常见的场景
    比如像京东商品详情页,其页面逻辑是非常复杂的,需要使用模板技术来实现。
    而Lua中也有许多模板引擎 lua-resty-template 可以渲染很复杂的页面,借助LuaJIT其性能也是可以接受的。

什么是动态页面?什么是静态页面?

  • 动态网页: 是以.asp、.jsp、.php、.perl、.cgi等形式为后缀,
    根据用户的不同的操作,呈现出不同的数据给用户看;
    eg: 浏览器的 搜索~ 输入不同的关键字 会呈现给用户不同的内容;

  • 静态页面: 静态网页是实际存在的,无需经过服务器的编译,直接加载到客户浏览器上显示出来。
    静态页面需要占一定的服务器空间,且不能自主管理发布更新的页面,
    如果想更新网页内容,要通过FTP软件把文件DOWN下来用网页制作软件修改(通过fso等技术例外)常见的静态页面举例:.html扩展名的、.htm扩展名的

  • 除了静态页面和动态页面还有一种的伪静态页面,在网站页面转化的时候大多转化成伪静态页面。

为什么需要页面静态化

  • 网页静态化有利于搜索引擎收录,静态页面和动态页面想对比来说,搜索引擎更喜欢静态页面
    对于静态页面也更好抓取收录,这样对于网站优化来说有很大的好处,更利于排名
    你可以去观察那些大型的门户网站,比如新浪、阿里巴巴、百度等页面大多采用静态或伪静态页面来显示,可想而知,这足够说明了静态化带给网站很大好处。

  • 网页静态化有利于网站的稳定性
    首先从安全角度来看,静态页面不容易遭受黑客的攻击,
    黑客从你的网址中看不出你网站的后台、网站的程序、数据库的地址,这样就比动态页面要安全的多。
    还有就是静态页面不会因为程序、数据库等出问题,影响网站的正常打开静态页面会使网站更加稳定,增加网站的信任度。

  • 网页静态化有利于提高速度
    SEO网站优化的一个很重要的因素就是网站打开速度的快慢,打开速度越快,SEO优化效果越好…
    众所周知动态页面打开都是要调用数据库内容,这样就影响了网站速度,而静态页面则不用,减少了环节,提高了网站反映速度。

实例Demo

Boot 多级缓存设置:

这里是 redis 和 Ehcache的Java代码缓存方式:不细致讲解可以了解:点击

  • Service层 —— Controller层——数据展示!

nginx 缓存 +页面静态化处理:

当然主要是 lua ...

info.lua

-- 中文转码
ngx.header.content_type="text/html;charset=utf8"
-- 获取url    参数
local uri_args = ngx.req.get_uri_args()
local goodsId = uri_args["goodsId"]
-- 打印日志
ngx.log(ngx.ERR,"json------",goodsId)local cache_ngx = ngx.shared.my_cache               -- nginx 缓存模板对象
local goodsCacheKey = "goods:"..goodsId              -- 设置key
local goodsCache = cache_ngx:get(goodsCacheKey)    -- 根据get(key); 获取缓存中数据!
-- 判断是否存在数据 “” 或 nil 就发送请求....
if goodsCache == "" or goodsCache == nil then
local http = require("resty.http")
local httpc = http.new()
local resp, err = httpc:request_uri("http://127.0.0.1:6001",{method = "GET",path = "/showinfo/"..goodsId
})
-- 获取结果
goodsCache = resp.body
-- 设置缓存时间
local expireTime = math.random(600,1200)
-- set(key,value); 设置缓存
cache_ngx:set(goodsCacheKey,goodsCache,expireTime)
end-- 日志输出
ngx.log(ngx.ERR,"json------",goodsCache)
-- 获取到JSON 模板!
local cjson = require("cjson")
local goodsCacheJSON = cjson.decode(goodsCache) -- 结果数据转换成JSON
-- 响应参数封装 context
local context = {goodsname = goodsCacheJSON.spu.name,
img = goodsCacheJSON.spu.images,
introduction = goodsCacheJSON.spu.introduction,
specItems = goodsCacheJSON.spu.specItems
}
-- 获取模板对象。
local template = require("resty.template")
template.render("item.html", context)         -- context 传入指定模板静态页面!

缓存

local cache_ngx = ngx.shared.my_cache               -- nginx 缓存模板对象local goodsCache = cache_ngx:get(goodsCacheKey)     -- 根据get(key); 获取缓存中数据!
-- 判断是否存在数据 “” 或 nil 就发送请求....
if goodsCache == "" or goodsCache == nil then-- 请求数据通过set方法,根据指定key 设置缓存/缓存时间(建议随机预防 缓存雪崩!)-- 设置缓存时间local expireTime = math.random(600,1200)-- set(key,value); 设置缓存cache_ngx:set(goodsCacheKey,goodsCache,expireTime)
end

ok。以上就是nginx 设置缓存的基本结构语法… 总的来说并不难!


页面静态化处理

nginx lua 通过:lua-resty-template实现大体内容有:

  • 模板位置:从哪里查找模板;
  • 变量输出/转义:变量值输出;
  • 代码片段:执行代码片段,完成如if/else、for等复杂逻辑,调用对象函数/方法;
  • 注释:解释代码片段含义;
  • include:包含另一个模板片段;

模板位置

  • 我们需要告诉lua-resty-template去哪儿加载我们的模块
    此处可以通过set指令定义 template_location、template_root 或者使用 root指令定义的位置加载

nginx执行的配置文件:指定该请求下的模板位置
lua.conf

#给nginx 分内存 128m 兆  缓存大小!用于存放热点数据(频繁使用的数据!)
lua_shared_dict my_cache 128m;#nginx服务
server {listen  9090;       #指定端口9090,默认80server_name    _;#静态资源管理模板地址...set $template_location "/templates";set $template_root "D:/WSMwork/www/templates";root D:/WSMwork/www/templates;    # "指定要导入的模板路径!"  #注意这里不能设置 中文地址!location /info{default_type text/html;content_by_lua_file D:/WSMwork/www/info.lua;}
}


加载顺序

  • 通过ngx.location.capture从template_location查找,如果找到(状态为为200)则使用该内容作为模板;
    此种方式是一种动态获取模板方式;

  • 如果定义了template_root,则从该位置通过读取文件的方式加载模板

  • 如果没有定义template_root,则默认从root指令定义的document_root处加载模板。

  • 建议首先template_root
    尽量不要通过root指令定义的document_root加载,因为其本身的含义不是给本模板引擎使用的。

这时候,静态数据就已将放在了nginx服务器中,启动运行…

  • 可以直接通过,请求来获取到服务器上部署的文件…
  • 当然对于静态的 html css Js...一些文件进行配置!注意html文件中引入的外部样式路劲进行更改!

lua 脚本控制静态页面:变量输出

-- 获取到JSON 模板!
local cjson = require("cjson")
local goodsCacheJSON = cjson.decode(goodsCache)    -- 返回结果数据转换成JSON
-- 响应参数封装 context
local context = {goodsname = goodsCacheJSON.spu.name,
img = goodsCacheJSON.spu.images,
introduction = goodsCacheJSON.spu.introduction,
specItems = goodsCacheJSON.spu.specItems
}-- 获取模板对象。
local template = require("resty.template")
--是否缓存解析后的模板,默认true
template.caching(true)
template.render("item.html", context)         -- context 传入指定模板静态页面!

  • item.html 商品详情页面。
    nginx 可以通过 context 给静态化页面设置一些变量实现 伪静态化页面 {* 变量名 *} 页面中输出值!

更多实例:

lua脚本
info1.lua

-- 中文转码
ngx.header.content_type="text/html;charset=utf8"
local template = require("resty.template")local context = {title = "测试",name = "张三",description = "<script>alert(1);</script>",age = 20,hobby = {"电影", "音乐", "阅读"},score = {语文 = 90, 数学 = 80, 英语 = 70},score2 = {{name = "语文", score = 90},{name = "数学", score = 80},{name = "英语", score = 70},}
}
template.render("t3.html", context)
  • 文件保存 utf-8 …格式;

静态页面:

lua.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h1> nginx页面静态化 </h1>{# 不转义变量输出 #}姓名:{* string.upper(name) *}<br/>{# 不转义输出,html形式输出,JS CSS 格式数据会成立! #}{* description *}{# 转义变量输出,已文本形式输出... #}简介:{{description}}<br/>{# 可以做一些运算 #}年龄: {* age + 1 *}<br/>{# 循环输出 #}爱好:{% for i, v in ipairs(hobby) do %}{% if i > 1 then %},{% end %}{* v *}{% end %}<br/>成绩:{% local i = 1; %}{% for k, v in pairs(score) do %}{% if i > 1 then %},{% end %}{* k *} = {* v *}{% i = i + 1 %}{% end %}<br/>成绩2:{% for i = 1, #score2 do local t = score2[i] %}{% if i > 1 then %},{% end %}{* t.name *} = {* t.score *}{% end %}<br/>{# 中间内容不解析 #}{-raw-}{(file)}{-raw-}{# 引入外部文件 #}{(lua2.html)}
</body>
</html>

lua2.html

<h1> 引入外部lua2.html 代码</h1>
  • {(include_file)}:包含另一个模板文件,相当于引入外部的 html 代码片段;
  • {* var *}:变量输出;
  • {{ var }}:变量转义输出, 不已以html 语法进行转义输出,可以使用 JS CSS等标签…
  • {% code %}:lua代码片段;
  • {# comment #}:注释;
  • {-raw-} 中间的内容不会解析,作为纯文本输出;

nginx配置文件
lua.conf 添加

location /info1{default_type text/html;content_by_lua_file D:/WSMwork/www/info1.lua;}
  • 模板最终被转换为Lua代码进行执行,所以模板中可以执行任意Lua代码。
  • 如果学习过JavaEE中的servlet和JSP的话,应该知道JSP模板最终会被翻译成Servlet来执行;
    而lua-resty-template模板引擎可以认为是JSP,其最终会被翻译成Lua代码,然后通过ngx.print输出。

测试:


openresty 页面静态化及多级缓存相关推荐

  1. php页面静态化,ob缓存方法

    <?php ob_start();//开启缓存 //要生成静态网页的内容开始 ?>中间的html代码<?php //要生成静态网页的内容结束 //把生成的静态内容保存到文件,而不是输 ...

  2. MySQL建表添加乐观锁字段_Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化...

    Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化 项目介绍 基于SpringBoot+Mybatis搭建的秒杀系统,并且针对高并发场景进行了优化,保证线 ...

  3. build vue 静态化_页面静态化

    页面静态化和静态缓存 静态缓存:还需要请求php一些简单的判断,只是一些复杂的逻辑结构不需要再进行php处理.如在缓存数据库中的数据,这样就不用每次都请求数据库.典型的例子就是smarty中有页面静态 ...

  4. 页面静态化(JSP动态页面转静态化)相关

    urlrewritefilter 下载:http://tuckey.org/urlrewrite/#download 所用基于动态的url http://www.nihaoblog.com/conte ...

  5. 页面静态化----------------------------------------个人笔记

    ***********************************************大型网站提速关键技术(页面静态化,mmecached,mysql优化)****************** ...

  6. 页面静态化2 --- 使用PHP缓存机制来完成页面静态化(上)(ob_flush和flush函数区别用法)...

    我们可以使用PHP自带的缓存机制来完成页面静态化,但在这里,需要说明一点,仅靠PHP缓存机制并不能完美的解决页面静态化,往往需要和其他页面静态技术(通常是伪静态技术)结合使用 例子: 当访问一个页面时 ...

  7. PHP ob缓存页面静态化技术

    判断大型网站的标准 1 Pv(page views) Page view 就是页面浏览次数: 一个网站在一天内,所有页面被浏览的次数综合., 上千万的pv值,百万级的也勉强可以算. 2  IP 一天内 ...

  8. 7.关于cdn、页面静态化

    我们之前一直都在介绍动态请求的加速,接下来讲一下静态请求,也就是cdn. 当请求来到服务器上时,如果是访问静态资源,那么就将请求解析到cdn加速域名中,再由cdn(海量的就近加速节点)就近看有没有存静 ...

  9. 【工具类】页面静态化 --- Freemarker的使用

    介绍 FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP. ...

最新文章

  1. 智能制造-逆向工程-三维测量-标定
  2. 第三届广东省强网杯网络安全大赛WEB题writeup
  3. 怎样把做好的css样式改日期,Win8操作系统任务栏中日期样式怎么更改
  4. Java enum枚举类型
  5. petshop4.0 详解之五(PetShop之业务逻辑层设计)[转]
  6. 超级详细的Spring Boot 注解总结
  7. android sd卡相关avc,Android 5.x 权限问题解决方法
  8. java密码加密方式_我去,同事居然用明文存储密码!!!
  9. 谈谈工业App (1)
  10. 增广矩阵and线性方程组----线性代数
  11. 打开Form时报错 FRM-18108:装载下列对象失败 FRM-10102不能附加PLSQL程序库
  12. 厦门大学2019年数学分析考研试题
  13. 昨天晚上我们组到龙华苹果园附近的“东北人“吃东北菜
  14. Android实现税博客,Android个人所得税计算器
  15. 矢志不渝,人生会慢慢露出轮廓。
  16. Win10自带SSH免密连接Virtulbox虚拟机
  17. Pytorch使用预训练模型进行图像分类
  18. ABR CQP CRF码率控制总结
  19. OnCreate函数
  20. 企业邮箱注册购买优惠有哪些,企业工作邮箱怎么注册购买?

热门文章

  1. 【日常】服务器入门补充
  2. phpstudy安装安全狗找不到服务名
  3. 三勾手机点餐收银系统源码,系统功能完善、页面美观,开源分享
  4. centos7搭建 mysql 主从数据库
  5. python numpy数据类型_Python之numpy数组学习(一)
  6. OA系统如何打造企业项目化管理
  7. C语言:写个程序把给定的符号打印成沙漏的形状。
  8. Online Collective Matrix Factorization Hashingfor Large-Scale Cross-Media Retrieval(OCMFH)--文献翻译
  9. Linux下,支付宝安全控件失效,解决方法
  10. 常用的干电池镍氢锂电池升压IC