Nginx Lua 缓存配置的实现步骤

 更新时间:2024年10月10日 10:21:19   作者:营赢盈英  
在Web应用缓存层次中,Nginx Lua缓存因其高效的协程机制,与Nginx的集成,以及OpenResty的扩展性,成为了一种高性能的缓存解决方案,本文就来详细介绍,感兴趣的可以了解一下

摘要:

web 应用业务缓存通常3级:

一级缓存:JVM 本地缓存

二级缓存:Redis集中式缓存

三级缓存:Nginx Proxy Cache 缓存 或 Nginx Lua 缓存

四级缓存:静态资源CDN缓存 页面静态化

本文主要分享 Nginx Lua 缓存配置开发

鉴于 Nginx Proxy Cache 缓存的劣势,在生产项目中很少使用,如果真正要体现出在距离用户最近的位置设置缓存,需要使用 Nginx Lua 缓存,才能发挥出缓存的优势。

Lua 脚本语言出现前,需要使用 c 或 c++ 语言开发Nginx功能,难度大,风险高。Nginx和Lua集成后,可以通过 Lua 脚本配置 Nignx 。

Nginx Lua 脚本开发的优势:

协程机制

  • 协程是线程内独立的运行单元,依附于线程的内存模型,切换开销小。
  • 完全可以使用同步方式编写代码,不需要考虑异步机制。如果执行过程中遇到了类似IO的阻塞事件,会到Nginx异步模型epoll上注册回调句柄,让出cpu执行权。如果异步模型接收到阻塞事件调用的返回后,唤醒对应的协程。
  • 对共享变量的访问,都无需加锁。

Lua 的协程机制 类似于 Nginx 的协程机制。

Nginx 协程

  • nginx 每个worker进程都是在epoll或kqueue这种事件模型之上,封闭成协程。
  • 每个请求都有一个协程处理
  • 即使 ngx_lua 相对 C 有一定的开销,但依旧能保证高并发能力
  • nginx 每个工作进程都创建一个 lua 虚拟机
  • 工作进程内所有 协程 共享 这个 lua 虚拟机
  • 每个外部请求都有一个 lua 协程处理,每个 lua 协程之间的数据隔离
  • lua 代码调用 io 等异步接口时,协程被挂起上下文数据,向 epoll select 异步模型上注册句柄 ,如果异步模型接收到阻塞事件的响应,唤醒协程,还原协程上下文,继续执行代码。

        所以Nginx协程相比于 JVM的 servlet的多线程机制更高效。

Nginx 生命周期11个处理阶段

可以在 Nginx 的生命周期过程中,添加 Lua 控制功能,实现对Nginx功能的配置。

NGX_HTTP_POST_READ_PHASE = 0                    // 读取请求头
NGX_HTTP_SERVER_REWRITE_PHASE = 0        // 执行 uri rewrite    rewrite_handler
NGX_HTTP_FIND_CONFIG_PHASE                  // 根据 uri 替换 location
NGX_HTTP_REWRITE_PHASE                          // 根据替换结果继续执行 rewrite rewrite_handler
NGX_HTTP_POST_REWRITE_PHASE              // 执行 rewrite 后处理
NGX_HTTP_PREACCESS_PHASE       // 可以用于处理限流场景
                // 认证预处理 请求限制(limit_req_handler) 连接限制(limit_conn_handler)
NGX_HTTP_ACCESS_PHASE              // 可用于处理 token 的场景
                // 认证处理 auth_basic_handler   access_handler  
NGX_HTTP_POST_ACCESS_PHASE         // 认证后处理 认证不通过 丢包
NGX_HTTP_TRY_FILES_PHASE                // 深度 try 标签
NGX_HTTP_CONTENT_PHASE                 // 内容处理   static_handler
NGX_HTTP_LOG_PHASE                           // 日志处理   log_handler

Nginx Lua 挂载点

init_by_lua                系统启动时调用

init_worker_by_lua        worker进程启动时调用

set_by_lua                nginx变量使用复杂 lua return

rewrite_by_lua        重写 url 规则

access_by_lua        权限验证阶段

content_by_lua        内容输出阶段(使用较多)

OpenResty

OpenResty 的优势:

  • 生产项目中可以使用 OpenResty 来进行 Lua 功能开发,因为 OpenResty 以 Nginx 为核心并集成了很多第三方模块,默认集成了 Lua 开发环境,使 Nginx 可以作为 Web Server 使用。
  • 借助于 Nginx 的事件驱动模型和非阻塞 IO ,可实现高性能的 Web 应用程序。
  • OpenResty 提供了大量组件如 Mysql  Redis  Memcached 等,使在 Nginx 上开发 web 应用更方便简单。

OpenResty 可以通过 shared dic 共享内存字典,实现远超过 proxy cache 性能的缓存,因为 shared dic 对所有 worker 进程都可见,并加成了 LRU 淘汰规则。再加上 OpenResty 对 Redis 的支持,可以实现更高性能的三级缓存。

nginx.conf

...
# 配置 shared dictionary 的扩展,声明128m的内存承载共享字典访问
lua_shared_dict lua_cache 128m;
...

server {
...
# 设置location用来做访问shared dict的lua文件
location /luadetail/get {
    default_type "application/json";
    content_by_lua_file ../lua/sharedis.lua
...
sharedis.lua


local args = ngx.req.get_uri_args()
local id = args["id"]
local redis = require "resty.redis"
local cache = redis:new()
local ok,err = cache:connect("172.16.16.16", 6379)
local product = cache:get("product_"..id)
if product == ngx.null or product == nil then
    local resp = ngx.location.capture("/product/get?id="..id)
    product = resp.body
end
ngx.say(product)

显然,Nginx 缓存直接读取 Redis 中的数据既能保证高效率,也不需要关心缓存中数据的更新失效策略,相比于使用 Nginx 服务器内存作缓存载体更高效。

到此这篇关于Nginx Lua 缓存配置的实现步骤的文章就介绍到这了,更多相关Nginx Lua 缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • nginx 反向代理之 proxy_pass的实现

    nginx 反向代理之 proxy_pass的实现

    这篇文章主要介绍了nginx 反向代理之 proxy_pass的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)

    Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)

    这篇文章主要介绍了Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度),需要的朋友可以参考下
    2022-01-01
  • Nginx出现403错误,应该如何解决

    Nginx出现403错误,应该如何解决

    这篇文章主要介绍了Nginx出现403错误,应该如何解决?具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • nginx使用nginx-rtmp-module模块实现直播间功能

    nginx使用nginx-rtmp-module模块实现直播间功能

    做的过程出现很多问题,环境其实就需要nginx就可以,然后就是在播放的问题,m3u8的格式,mac直接访问就支持,苹果系统原生H5支持m3u8,还有就是手机直接访问也支持!但是其他其他系统PC端不支持,尝试了好多都不行,最后终于找到了一个支持m3u8格式H5播放
    2017-10-10
  • Nginx的c30k问题解决方法

    Nginx的c30k问题解决方法

    这篇文章主要介绍了Nginx的c30k问题解决方法,本文同时探讨了Nginx AIO的使用问题,需要的朋友可以参考下
    2014-09-09
  • nginx日志格式分析以及修改详解

    nginx日志格式分析以及修改详解

    Nginx日志对于统计、系统服务排错很有用,下面这篇文章主要给大家介绍了关于nginx日志格式分析以及修改的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 利用Nginx反向代理功能解决WEB网站80端口被封的解决方法

    利用Nginx反向代理功能解决WEB网站80端口被封的解决方法

    大陆的网络环境,都在天朝神兽的制度下让我等小P民悲剧一片;动不动就拔网线、封机房;现在更厉害的一招,从网关封杀你的80端口,一旦被封,网站域名就无法访问
    2012-08-08
  • 详解NGINX访问https跳转到http的解决方法

    详解NGINX访问https跳转到http的解决方法

    这篇文章主要介绍了详解NGINX访问https跳转到http的解决方法,非常具有实用价值,需要的朋友可以参考下
    2017-06-06
  • nginx 负载均衡的三种参数设置

    nginx 负载均衡的三种参数设置

    这篇文章主要介绍了nginx 负载均衡的三种参数设置,需要的朋友可以参考下
    2017-07-07
  • 使用goaccess分析nginx日志的详细方法

    使用goaccess分析nginx日志的详细方法

    goaccess 工具提供快速、多样的HTTP状态统计,可以令管理员不再纠结于统计各类数据,和繁杂的指令以及一大堆管道/正则表达式说再见,今天通过本文给大家介绍goaccess 分析nginx 日志的方法,需要的朋友一起看看吧
    2021-07-07

最新评论