调用:
local url = "sina.cn"
checkForValidUrl(url)
就一直报:
*150 lua handler aborted: runtime error:
/usr/local/openresty/nginx/conf/lua/chk.lua:30:
attempt to call global 'checkForValidUrl' (a nil value),...
这算什么事儿吼,,,
--
人生苦短, Pythonic! 冗余不做,日子甭过!备份不做,十恶不赦!
俺: http://about.me/zoom.quiet
文字协议: http://creativecommons.org/licenses/by-sa/2.5/cn/
discuss is closed ;-(
> --
> 邮件自: 列表"openresty",专用于技术讨论!
> 发言: 请发邮件到 open...@googlegroups.com
> 退订: 请发邮件至 openresty+...@googlegroups.com
> 详情: http://groups.google.com/group/openresty
> 官网: http://openresty.org/
> 仓库: https://github.com/agentzh/ngx_openresty
> 建议: 提问的智慧 http://wiki.woodpecker.org.cn/moin/AskForHelp
刚刚开始写 lua 就遇到非常超出经验的问题:
一个原型函式:
function checkForValidUrl(uri)
return uri
end
调用:
local url = "sina.cn"
checkForValidUrl(url)
非常自然的方式,不过,俺这样作,error":
[error] 3749#0: *10 lua handler aborted: runtime error:
/usr/local/openresty/nginx/conf/lua/chk.lua:3: m
odule 'kcs' not found:
no field package.preload['kcs']
no file '/usr/local/openresty/lualib/kcs.lua'
no file './kcs.lua'
no file '/usr/local/openresty/luajit/share/luajit-2.0.0-beta9/kcs.lua'
no file '/usr/local/share/lua/5.1/kcs.lua'
no file '/usr/local/share/lua/5.1/kcs/init.lua'
no file '/usr/local/openresty/luajit/share/lua/5.1/kcs.lua'
no file '/usr/local/openresty/luajit/share/lua/5.1/kcs/init.lua'
no file '/usr/local/openresty/lualib/kcs.so'
,,,
即使俺在nginx 配置中有:
# 设置纯Lua扩展库PATH(';;' is the default path):
lua_package_path 'conf/lua/?.lua;;';
# or
lua_package_path '/usr/local/openresty/nginx/conf/lua/?.lua;;';
都无法在 chk.lua 中通过:
local KCS = require "kcs"
加载: /usr/local/openresty/nginx/conf/lua/kcs.lua
-- KCS API support
module("kcs", package.seeall)
...
怎么想屔,,,
> 因为 Lua module 只会在第一次请求时加载一次(除非显式禁用了 lua_code_cache 配置指令),后续请求便可直接复用。
>
> Regards,
> -agentzh
--
然后在外头调用 abc.xxx,
第一次curl成功了,后面curl就500,报nil function;
然后reload,又是第一次ok,后面失败。
求解释。
就一切安定了,agentzh 没说:
- module(..., package.seeall) 这儿直接就用 ...
- 所有 openresty 环境中,俺猜都是从 nginx/conf 为起点的
- 所以,即使 包和应用都在同一级目录中
- 依然要使用子包的模式来引用 ;-(
-- resty/mongo.lua
module("resty.mongo", package.seeall)
local bit = require "bit"
local bson = require "bson"
这怎么回事儿吼?
- 下层调用上层的不用 ../ 的?
- 反正这方面,俺一直 chaos ,蒙对就一直用,没有深入 ;-)
非常自然的方式,不过,俺这样作,error":
[error] 3749#0: *10 lua handler aborted: runtime error:
/usr/local/openresty/nginx/conf/lua/chk.lua:3: m
odule 'kcs' not found:
no field package.preload['kcs']
no file '/usr/local/openresty/lualib/kcs.lua'
no file './kcs.lua'
no file '/usr/local/openresty/luajit/share/luajit-2.0.0-beta9/kcs.lua'
no file '/usr/local/share/lua/5.1/kcs.lua'
no file '/usr/local/share/lua/5.1/kcs/init.lua'
no file '/usr/local/openresty/luajit/share/lua/5.1/kcs.lua'
no file '/usr/local/openresty/luajit/share/lua/5.1/kcs/init.lua'
no file '/usr/local/openresty/lualib/kcs.so'
,,,
嗯嗯嗯?! mongo 的还没有完成?
https://github.com/ericzhang-cn/lua-resty-mongo
lib/
+- bson.lua
+- resty/mongo.lua
-- bson.lua
module("bson", package.seeall)
-- resty/mongo.lua
module("resty.mongo", package.seeall)
local bit = require "bit"
local bson = require "bson"
这怎么回事儿吼?
- 下层调用上层的不用 ../ 的?
- 反正这方面,俺一直 chaos ,蒙对就一直用,没有深入 ;-)
>> no file
>> '/usr/local/openresty/luajit/share/luajit-2.0.0-beta9/kcs.lua'
>> no file '/usr/local/share/lua/5.1/kcs.lua'
>> no file '/usr/local/share/lua/5.1/kcs/init.lua'
>> no file '/usr/local/openresty/luajit/share/lua/5.1/kcs.lua'
>> no file '/usr/local/openresty/luajit/share/lua/5.1/kcs/init.lua'
>> no file '/usr/local/openresty/lualib/kcs.so'
>> ,,,
>>
>
> 这里的出错信息已经详细地指出了 Lua 尝试过的加载路径。如果你的 kcs.lua 在 /foo/bar/blah/ 下,则应当在
> lua_package_path 配置指令中添加 /foo/bar/blah/?.lua
> 这一项。另外,使用相对路径时要小心,你认为的当前工作目录可能并不是实际的当前工作目录。
>
- 收到!
- 不过, lua_package_path '/usr/local/openresty/nginx/conf/lua/?.lua;;';
俺的确加了
server{
这里尝试过
...
location ~ ^/=/(\w+) {
这里也尝试过
...
}
}
好象 lua_package_path 没有执行一样,
openresty 是否有 pachage_path 的查询功能?
- 可以看到当前请求时的包查询路径列表?
- 收到!
- 不过, lua_package_path '/usr/local/openresty/nginx/conf/lua/?.lua;;';
俺的确加了
server{
这里尝试过
openresty 是否有 pachage_path 的查询功能?
- 可以看到当前请求时的包查询路径列表?
- FT! 俺一直使用 reload 来重载 nginx 的
- 使用 restart 后,才真正检查配置,才见到这一提示,,,
了了,,,
- 维基文档中除了示范中暗示了命令应该的位置,其它没有任何地方进行强调
- 看来任何一份儿手册,都隐藏了无数细节,有侍撞上,,,
- 嗯嗯嗯,这是 error 的输出,給人看的,
- 俺在想,openresty 是否有相关的自省能力
- 可以在运行时,自我检验 内置路径,进行加载的修补
- 不过,现在想来,Nginx 的完整世界是一但跑起来就自成一国的
- 不能随意变更的
- 居然有热部属的能力,但是,这不应该是 openresty 想的事儿?
- 嗯嗯嗯,这是 error 的输出,給人看的,
- 俺在想,openresty 是否有相关的自省能力
- 可以在运行时,自我检验 内置路径,进行加载的修补
- 不过,现在想来,Nginx 的完整世界是一但跑起来就自成一国的
- 不能随意变更的
- 居然有热部属的能力,但是,这不应该是 openresty 想的事儿?
是也乎,俺没有説明白
- 不是问题,是期望的新功能了,,,
- 具体场景,俺有合适示例时,再提出吧,
thanx for all
> 或许我们应该在 nginx 启动时自动把整个进程所使用的当前工作目录切换到 nginx
> 的“配置前缀”路径?大家伙有什么看法?如果真要做这件事情的话,因为在 ngx_lua 中实现,还是以单独的 nginx 模块的形式实现,还是以
> nginx 核心的补丁的形式来实现?
>
- 如果这是 nginx 的内核行为,建议不进行补丁
- 而是提供专用模块,进行显式声明,形如
http{
ngx_workroot_as_path '/usr/local/openresty/nginx/';
# 配合起来就可配置文件全局使用 相对路径了!
lua_package_path 'conf/lua/?.lua;;';
}
- 进一步的,允许多次配置 ngx_workroot_as_path
- 使不同功能的 ngx_lua 业务模块,可以分發在不同的起始目录?
- 以便进行合理的分仓库版本/发布/升级管理
> Regards,
> -agentzh
- 神奇! 即使俺是通过 /opt/sbin/openresty.server 伺候脚本重启 nginx 的
- 也一样记录为调用 openresty.server 时的所在目录!!
- 嗯嗯嗯,最土的,就是最有效的方式!
- 收到! 收录到乱入手册中 ;-)
> Best,