问题

  • 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

解释:

  1. 9229(第一个):这是在本地电脑上创建的端口。通过访问本地 localhost:9229,会自动将请求转发到目标服务器的端口 9229
  2. 192.168.0.219:这是 目标机器 的 IP 地址(或主机名),即你想要连接的最终服务器,在此次问题中,跳板机器与目标机器在同一局域网,因此这里提供的是内外ip,另外需要注意:需要授权目标机器的9229端口对跳板机可访问,通常在云服务提供商后台配置
  3. 9229(第二个):这是 目标机器上目标应用程序(Node.js)的监听端口。
  4. 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一栏中,找到要调试的问题,打上断点,就可以愉快的调试啦