【发布时间】:2019-11-19 10:13:44
【问题描述】:
我在 docker 容器中有 openresty 应用程序:
FROM openresty/openresty:xenial
RUN luarocks install luasocket
# Add additional binaries into PATH for convenience
ENV PATH=$PATH:/usr/local/openresty/luajit/bin:/usr/local/openresty/nginx/sbin:/usr/local/openresty/bin
ENV LUA_PATH="/usr/local/openresty/site/lualib/?.ljbc;/usr/local/openresty/site/lualib/?/init.ljbc;/usr/local/openresty/lualib/?.ljbc;/usr/local/openresty/lualib/?/init.ljbc;/usr/local/openresty/site/lualib/?.lua;/usr/local/openresty/site/?.lua;/usr/local/openresty/site/lualib/?/init.lua;/usr/local/openresty/site/?/init.lua;/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua"
ENV LUA_CPATH="/usr/local/openresty/site/lualib/?.so;/usr/local/openresty/lualib/?.so;./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so"
CMD ["/usr/local/openresty/bin/openresty", "-g", "daemon off;"]
这里是 nginx.conf 示例:
server {
listen 80;
server_name localhost;
# disable code cache, do not need reload nginx with all changes
lua_code_cache off;
location / {
rewrite_by_lua_block {
local Core = require "core"
Core.rewrite()
}
}
}
核心lua文件源(每行都有断点):
_G.debug = require("debug")
local Core = {}
function Core:rewrite()
require("mobdebug").start("host.docker.internal")
local a = 2
ngx.say(a)
end
return Core
所以,我尝试使用 EmmyLua (IDEA) + mobdebug 远程调试我的 openresty 应用。
调试开始+http调用后:
Start mobdebug server at port:8172
Waiting for process connection...
Connected.
之后什么都没有发生。 我可以看到来自 openresty 的响应,但调试仍处于活动状态,并显示消息“已连接”。
我做错了什么?
【问题讨论】:
-
init_by_lua_*系列指令初始化nginx实例;这是一个与最终处理请求的工作进程不同的线程。如果我没记错的话,您需要在init_worker_by_lua_*指令之一中使用一些东西,否则将找不到它们。 -
没关系,我只是检查了一下,没关系。但是,我发现禁用 Lua 代码缓存会导致在
init_by_lua中声明的变量被“遗忘”。总之,我想我的建议是:总是在你需要它们的地方需要它们。在生产中,它们可能会被缓存,在开发中它们可能每次都需要;无论哪种方式,这都是一个实现细节。 -
@DarkWiiPlayer,本地要求没有帮助。我已经用示例更新了我的问题。
标签: docker intellij-idea lua remote-debugging openresty