【问题标题】:Remotely debugging my node app that is hosted on AWS远程调试托管在 AWS 上的节点应用程序
【发布时间】:2014-01-30 04:47:15
【问题描述】:

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

两个问题:

  • 我可以用 node-inspector 做到这一点吗?我希望可以,但节点检查器无法安装在我的 AWS 实例上。

  • 任何替代方案可以让我这样做吗?

【问题讨论】:

    标签: node.js debugging amazon-web-services


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为这是最好的选择,因为--inspect=0.0.0.0:9229 对任何人都开放,除非您设置了防火墙。扩展这个答案(因为我自己一开始并不理解):ssh -L <local-port>:127.0.0.1:<remote-port> <server-ip/domain>。您可能已经将 9229 用于本地应用程序,所以 local-port 必须是其他东西(我选择了 9339),“远程端口”默认为 9229。然后你必须保持 ssh 连接打开,进入 Chrome 的节点目标并添加localhost:9339(或你选择的任何端口)。瞧。
    【解决方案2】:

    您也可以指定--web-host 参数。

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

    【讨论】:

    • +1 当您在虚拟机中工作并且想要从主机访问调试器时,这非常有效。
    【解决方案3】:

    这对我有用:

    1. 在服务器上启动节点检查器。
    2. 使用--debug 标志在远程服务器上启动被调试者。
    3. 注意调试器监听的端口,即Debugger listening on port DEBUG_PORT消息。
    4. 为端口 8080 创建一个 ssh 隧道,而不是像 Andrey Sidorov 的回答所建议的那样为 DEBUG_PORT 创建一个 ssh 隧道。
    5. 在浏览器中打开 SERVER_API:8080/debug?ws=127.0.0.1:8080&port=DEBUG_PORT 瞧。

    节点检查器 v0.10.1

    【讨论】:

    • 对我来说它有效,除了在第 5 步中,诀窍是 localhost:8080/?port=DEBUG_PORT
    【解决方案4】:

    tepez's 答案的帮助下,以下内容对我有用(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
    

    【讨论】:

    • 感谢您将 URL 与 SSH 命令一起显示。没有它就很容易混淆。对我来说效果很好!
    【解决方案5】:

    使用0.0.0.0 监听来自外部的请求的另一个选项:

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

    并访问此地址进行调试:

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

    如果 HTTP/2 可用会更好,因为有很多小文件。

    【讨论】:

    • 虽然我不会将它用于任何可公开访问的东西,但它适用于我在虚拟机上运行的开发环境。
    • 非常适合我。谢谢!
    【解决方案6】:

    您也可以在远程机器上使用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&amp;v8only=true&amp;ws=127.0.0.1:9229/bef2ae68
    4. 将其粘贴到您的 chrome 浏览器中

    享受:)

    如果您使用pm2,只需将其添加到您的生态系统.js

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

    【讨论】:

      【解决方案7】:

      请允许我使用node --inspect 提出替代方案。我有同样的需求,虽然在 Windows 环境中,我相信这应该适合你。

      远程机器(使用 Node 6.10.2、Windows Server 2012 测试)

      node --inspect=0.0.0.0:9229 &lt;appname&gt;.js

      本地机器(在 Win 10、Chrome 60.0.3112.90 上测试)

      在 Chrome DevTools 中 - 点击右上角的垂直省略号菜单

      1. 转到:更多工具 -> 远程设备
      2. 网络目标下点击添加地址
      3. 输入&lt;remote-ip&gt;:9229
      4. 输入地址并连接远程目标后,您将在 DevTools 的左上角看到 Node.JS 图标
      5. 单击 NodeJS 徽标以启动 DevTools 节点调试器

      以下步骤 1、3、4 的屏幕截图。

      【讨论】:

      • 这是不安全的,对吧?有没有一种安全的方法,比如只让你的家庭 IP 而不是任何人?
      • 您可以通过防火墙通过端口控制流向 EC2 实例的流量,以仅允许选定的 IP - 检查 EC2 安全组/VPC。
      • 我认为 Andrey Sidorov 的回答可能是一个更好的方法,至少对我来说,使用 SSH 隧道。
      • 谢谢 - 我们发现这可以将主机级 IDE 调试器附加到 Dockerised Node 应用程序。我的假设是,由于0.0.0.0 在容器级别,这实际上是主机上的 127.0.0.1。
      猜你喜欢
      • 2013-08-03
      • 2015-07-19
      • 2016-07-25
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多