问题
- nodejs项目,在本地环境运行代码正常,服务器环境报错,无法定位错误问题,从而产生调试远端服务器上的nodejs项目的想法
难点
- 如何进行调试,此前未进行过相关操作
- 服务器无法直接访问,只能通过跳板机访问
解决方案
1、nodejs本身提供了通过参数来开启调试模式 --inspect , 在nodejs服务所在的目标机器执行,具体如下:
node --inspect=0.0.0.0:9229 /your/nodejs/app/path/index.js
命令行将输出以下信息:
Debugger listening on ws://0.0.0.0:9229/76be0507-3e96-4ee0-89a2-47a3d043411c
For help, see: https://nodejs.org/en/docs/inspector
该条命令的意思是监听当前机器所有IP地址的9229端口,开启调试模式。
2、把服务器上的端口与本地做映射,开始我们说过,目标机器无法直接访问,需要跳板机,此时需要创建ssh隧道链接,我们来看下命令:
ssh -i [跳板机器私钥路径] -L [本地端口]:[目标地址]:[目标端口] [用户]@[跳板机地址]
在本地(mac机器)的 ~/.ssh/config
文件中检查是否有类似以下内容:
Host 跳板机IP
User root
IdentityFile ~/.ssh/id_rsa # 替换为你的私钥路径
如果配置了以上内容,则不需提供-i参数,我的机器做了这个配置,因此在此次问题终具体命令如下:
ssh -L 9229:192.168.0.141:9229 root@123.123.123.123
解释:
9229
(第一个):这是在本地电脑上创建的端口。通过访问本地localhost:9229
,会自动将请求转发到目标服务器的端口9229
。192.168.0.219
:这是 目标机器 的 IP 地址(或主机名),即你想要连接的最终服务器,在此次问题中,跳板机器与目标机器在同一局域网,因此这里提供的是内外ip,另外需要注意:需要授权目标机器的9229端口对跳板机可访问,通常在云服务提供商后台配置。9229
(第二个):这是 目标机器上目标应用程序(Node.js)的监听端口。root@123.123.123.123
:这是 SSH 的登录信息,表示使用root
用户连接到 123.123.123.123。
工作流程
- 你在本地电脑上访问
localhost:9229
,SSH会将这个请求转发给123.123.123.123。 - 123.123.123.123收到请求后,再将其转发到目标机器
192.168.0.219:9229
。 - 这样,本地电脑就可以通过
localhost:9229
直接访问 目标机器 的9229
端口。
最后一步
在chrome浏览器的地址栏里输入:
chrome://inspect/#devices
如果一切正常,你将可以看到Remote Target列表中出现 index.js 并配有 inspect的按钮, 点击按钮将唤起chrome的调试面板,在Sources一栏中,找到要调试的问题,打上断点,就可以愉快的调试啦