远程调试我的托管在AWS上的Node应用程序

33

我想连接到在AWS上以调试模式运行的节点服务器(node --debug app.js),并能够远程调试我的应用程序。

两个问题:

  • 我能用node-inspector做到这一点吗?我希望能够,但是node-inspector无法安装在我的AWS实例上。

  • 有任何替代方案可以让我做到这一点吗?

7个回答

44

tepez 的 回答的帮助下,以下内容对我有用(Node Inspector v0.12.2):

在我的机器上:

ssh -L 8080:127.0.0.1:8080 <username>@<host> -N

在远程服务器上:

node-debug --cli <appname>

在浏览器中输入以下地址:

127.0.0.1:8080/?ws=127.0.0.1:8080&port=5858

4
感谢您在 SSH 命令中提供 URL,这样做让人不易混淆。对我非常有帮助! - killthrush

27

从您的开发机器使用ssh转发远程调试器端口

ssh -L 5858:127.0.0.1:5858 ubuntu@some.ec2.host.com

现在,您可以像本地运行调试器一样启动node-inspector


4
我认为这是最佳选项,因为 --inspect=0.0.0.0:9229 除非你设置了防火墙,否则会向所有人开放。更详细地说(因为我起初自己也没看懂):ssh -L <local-port>:127.0.0.1:<remote-port> <server-ip/domain>。你可能已经在本地应用程序中使用了9229端口,所以 local-port 必须选择其他端口(我选择了9339),'remote-port' 默认情况下将是9229。然后,您必须保持ssh连接打开,在Chrome的Node目标中添加 localhost:9339 (或您选择的任何端口)。完成了。 - Kenmore

16

允许我介绍一种使用node --inspect的替代方法。虽然我在Windows环境下进行测试,但我相信这对您也适用。

远程机器(已在Node 6.10.2和Windows Server 2012上测试)

node --inspect=0.0.0.0:9229 <appname>.js

本地计算机(已在Win 10和Chrome 60.0.3112.90上测试)

在Chrome开发者工具中 - 单击右上角的垂直省略菜单

  1. 转到:更多工具 -> 远程设备
  2. 网络目标下单击添加地址
  3. 输入<remote-ip>:9229
  4. 一旦您输入了地址并且远程目标已连接,您将在DevTools左上角看到Node.JS图标
  5. 单击NodeJS Logo启动DevTools Node Debugger

下面是步骤1、3、4的截图。

DevTools Menu

Network Targets Remote Target Connected


这样做是不安全的,对吧?有没有一种安全的方法,比如只允许你家的IP地址而不是任何人? - Kenmore
1
您可以通过防火墙控制EC2实例的端口流量,仅允许选定的IP地址 - 请查看EC2安全组/VPC。 - Alex Wachira
我认为Andrey Sidorov的回答可能是更好的方法,至少对于我来说,使用SSH隧道。 - Kenmore
1
谢谢 - 我们发现这种方式可以将主机级别的 IDE 调试器附加到一个 Docker 化的 Node 应用程序上。我的假设是由于 0.0.0.0 在容器级别上,因此在主机上实际上是 127.0.0.1。 - halfer

13

还有一种使用0.0.0.0的选项,可以监听来自外部的请求:

node-debug --web-host=0.0.0.0 --cli app.js

并访问此地址进行调试:

http://<the-domain>:8080/?port=5858

如果有HTTP/2,由于存在大量小文件,使用起来会更好。


虽然我不会将其用于任何公开访问的内容,但它在我的虚拟机上运行良好,非常适合我的开发环境。 - RobotNerd
对我来说运行得完美。谢谢! - Tigertron

10

您可以在远程机器上使用node --inspect

  1. 使用node --inspect myapp.js启动您的节点。
  2. 然后在本地执行ssh -L 9229:127.0.0.1:9229 myuser@myserver -N
  3. 在日志头中搜索这样的字符串并将其复制:chrome-devtools://devtools/remote/serve_file/@60cd6e859b9ff284980/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/bef2ae68
  4. 将其粘贴到您的Chrome浏览器中。

享受吧 :)

如果您正在使用pm2,只需在您的ecosystem.js中添加此内容。

"apps": [{
    "name": "myapp",
    "script": "index.js",
    "node_args": ["--inspect"],
...

9

同时,你可以指定--web-host参数。

node-inspector --web-host host.amazonaws.com

1
+1 当您在虚拟机内工作并希望从主机访问调试器时,此方法非常有效。 - JohnP

6
这是对我有效的解决方法:
  1. 在服务器上启动node-inspector。
  2. 在远程服务器上使用--debug标志启动debugee。
  3. 注意调试程序监听的端口,即Debugger listening on port DEBUG_PORT消息。
  4. 为端口8080创建ssh隧道,不要像Andrey Sidorov的答案建议的那样使用DEBUG_PORT
  5. 在浏览器中打开SERVER_API:8080/debug?ws=127.0.0.1:8080&port=DEBUG_PORT,然后就可以了。

Node Inspector v0.10.1


对我而言,在步骤5中起作用的是localhost:8080/?port=DEBUG_PORT。 - aviv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接