lua_code_cache off/on
本文转自:http://blog.csdn.net/qinyushuang/article/details/44857995
语法和使用场景
语法: lua_code_cache on | off
使用的上下文:http, server, location, location if
作用:lua_code_cache是nginx_lua模块的一条指令。它为 *_by_lua_file(如 set_by_lua_file 和 content_by_lua_file) 这些指令以及Lua模块, 开启或关闭Lua代码缓存.(nginx_lua模块说明:http://wiki.nginx.org/HttpLuaModule#lua_code_cache)
如果关闭,每个ngx_lua处理的请求将运行在一个独立的Lua VM实例里,0.9.3版本后有效. 所以 set_by_lua_file, content_by_lua_file, access_by_lua_file, 等等指令引用的Lua文件将不再缓存到内存, 并且所有Lua模块每次都会从头重新加载. 这样开发者就可以避免改代码然后重启nginx的操作.
但是, 那些直接写在 nginx.conf 里的代码比如由 set_by_lua, content_by_lua, access_by_lua, and rewrite_by_lua 指定的代码不会在你编辑他们时实时更新,因为只有发送HUP信号通知Nginx才会正确重新加载Nginx的config文件。
即使打开了代码缓存, 那些*_by_lua_file指令里由 dofile 或 loadfile 加载的Lua文件也无法被缓存 (除非你自己手动缓存了他们). 通常你可以用 init_by_lua 或 init_by_lua_file 其中一种指令来加载所有这些无法被缓存 的文件,或把这些文件做成真正的Lua模块并用require加载.
生产环境下千万别关闭Lua代码缓存,只能用在开发模式下,因为对性能有十分大的影响(每次IO读取和编译Lua代码消耗很大, 简单的hello world都会慢一个数量级)
常见问题
网上有很多小伙伴们遇到过和我一样的问题:当lua_code_cache开关打开时,当使用content_by_lua 引入外部的lua文件,并且在lua文件中有对应的内容输出,只有第一次运行脚本的时候正常,如果再次运行,浏览器就会提示500 服务器内部错误。或者第一次请求有响应数据,第二次提示响应数据为空。
问题的原因:
类似这种问题的原因常见的错误是你使用的 lua文件的模块滥用 Lua 全局变量来存放其内部状态信息,而不是模块 table 本身。
而在lua_code_cache on 时,全局变量的生命期是每请求的,所以会出现这种情况:
第一个请求调用 require 加载了你用lua文件写的模块,而你的该模块把内部状态保存在了和第一个请求相关联的某些全局变量中。
后续的各次请求调用 require 时直接返回了步骤 1 中已经加载过的lua模块所对应的 table.
但此时后续请求的全局变量都是干净的(和第一个请求无关),于是该lua模块无法得到它需要的内部状态数据,出现访问未初始化变量的错误。
解决方式和建议:
总是使用下面的形式来加载 Lua 模块:
local foo = require "foo" -- This is correct!
而不是简单地
require "foo" -- This is wrong!!
在你自己的 Lua 模块中避免使用 Lua 全局变量(对于必需的文件范围的变量,可以使用 local 在最外层作用域定义之)。
你可以使用下面文档中的办法来检查你的 .lua 文件中是否有使用 Lua 全局变量:
http://lua-users.org/wiki/DetectingUndefinedVariables
可以使用这篇文章中介绍到的基于 luac 命令行工具的静态代码检查方式来检查是否有使用lua全局变量,即
luac -p -l yourprogram.lua | grep ETGLOBAL
从这里拿的:https://groups.google.com/forum/#!topic/openresty/W0dvD5Wm0Bw
|
lua_code_cache off/on相关推荐
- OpenResty搭建高性能服务端
Socket编程 Linux Socket编程领域为了处理大量连接请求场景,需要使用非阻塞I/O和复用,select.poll.epoll是Linux API提供的I/O复用方式,自从Linux2.6 ...
- Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类
RBAC介绍 RBAC(Role-Based Access Control,基于角色的访问控制),用户基于角色的访问权限控制.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成&q ...
- Openresty最佳案例 | 第7篇: 模块开发、OpenResty连接Redis
Lua模块开发 在实际的开发过程中,不可能把所有的lua代码写在一个lua文件中,通常的做法将特定功能的放在一个lua文件中,即用lua模块开发.在lualib目录下,默认有以下的lua模块. lua ...
- Openresty最佳案例 | 第5篇:http和C_json模块
http客户端 Openresty没有提供默认的Http客户端,需要下载第三方的http客户端. 下载lua-resty-http到lualib目录下,使用以下的命令下载: cd /usr/examp ...
- Openresty最佳案例 | 第4篇:OpenResty常见的api
获取请求参数 vim /usr/example/example.conf location /lua_var {default_type 'text/plain';content_by_lua_bl ...
- Openresty最佳案例 | 第3篇:Openresty的安装
我的服务器为一台全新的centos 7的服务器,所以从头安装openresty,并记录了安装过程中出现的问题,以及解决办法. 1.首先安装openresty cd /usr mkdir servers ...
- 学习openresty的log_by_lua*和stream-lua-nginx-module模块
2019独角兽企业重金招聘Python工程师标准>>> 1.实例: log.lua文件 local cjson = require "cjson.safe" lo ...
- nginx-lua-openresty-graphicsmagick 下载远程图片,本地缩图红缓存加水印
2019独角兽企业重金招聘Python工程师标准>>> 先上全部代码吧nginx.confworker_processes auto; user hubs; # 日志级别调试时可设为 ...
- Nginx + Lua + redis (一)(转)
使用 Lua 脚本语言操作 Redis. 由于大量的 Lua 代码写在 Nginx 中,会使配置文件显得很繁琐,所以这里使用 content_by_lua_file 来引入 Lua 脚本文件. 要使用 ...
最新文章
- Codeforces 396A 数论,组合数学
- java判断栈空_java中栈的应用-判断分隔符是否合理
- Google Maps API 进级:通过XML文档加载Gpolyline或者Gpolygon
- Visio画大括号、花括号
- 团队作业-Beta冲刺第二天
- EasyUI实现工地领款单项目
- Python学习入门7:python学习从基础到高手,再到就业
- 6.Hibernate多对多关系建立
- Extjs项目使用技巧————文件上传
- 03 vsftpd 登录过程的调试
- 办公自动化和计算机应用哪个好,高级办公自动化和计算机二级VF哪个更好?两个都考有必要吗?...
- 网站优化后如何降低阿里云国际版服务器成本
- 俄勒冈之旅_俄勒冈州波特兰市严格禁止面部识别技术
- error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-h4wtvo23\opencv\
- 2、快速选择工具和魔棒工具
- LC.826. Most Profit Assigning Work
- ITopologicalOperator Intersect
- 计算机语言栏在哪里,缺少计算机语言栏的解决方案是什么
- 基于卷积神经网络的密集人群估计/人群计数算法【内含教程和踩坑】
- uniapp系列-改变底部安全区-顶部的手机信号、时间、电池栏颜色样式