【问题标题】:How to run nightmare.js on google appengine for node.js如何在 google appengine 上为 node.js 运行 nightmare.js
【发布时间】:2016-10-04 03:59:36
【问题描述】:

famous issue 的噩梦和电子不在无头 linux 服务器上运行。官方electron docs建议使用xvfb来伪造显示。他们建议将此 .yml 文件用于 travis。

插件: 易于: 包: - xvfb 安装: - 导出 DISPLAY=':99.0' - Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &

问题

如何将上述代码用于 node.js 的 google appengine 的 app.yaml 文件。我曾尝试按原样使用它,但 glcoud 会抛出一个错误,即 addon 是无效命令。间隙official docs 没有类似的命令。

关于我们如何在 google appengine for node.js 上运行 nightmare 和 electron 有什么建议吗?

【问题讨论】:

    标签: node.js google-app-engine yaml electron nightmare


    【解决方案1】:

    与这个问题相关的有两部分:

    1. 在 linux 上无头运行 chromium(电子和噩梦“使用”的东西)。
    2. 安装/使用 xvfb 在应用引擎上运行 chromium。

    第 1 部分)

    你需要 xvfb。

    Xvfb(虚拟帧缓冲区)只是一个程序,来自 wiki:“是一个实现 X11 显示服务器协议的显示服务器。与其他显示服务器相比,Xvfb 在内存中执行所有图形操作,而不显示任何屏幕输出。”

    这是在没有屏幕输出的情况下运行浏览器所需要的。

    首先,安装所有xvfb相关的包,以便在linux上运行。

    apt-get install -y \ xvfb \ x11-xkb-utils \ xfonts-100dpi \ xfonts-75dpi \ xfonts-scalable \ xfonts-cyrillic \ x11-apps \ clang \ libdbus-1-dev \ libgtk2.0-dev \ libnotify-dev \ libgnome-keyring-dev \ libgconf2-dev \ libasound2-dev \ libcap-dev \ libcups2-dev \ libxtst-dev \ libxss1 \ libnss3-dev \ gcc-multilib \ g++-multilib

    因此,安装了 xvfb 后,您需要创建一个虚拟 xvfb 屏幕并导出指向它的名为 DISPLAY 的环境变量。 Electron 中的 Chromium 会自动查找 $DISPLAY。

    以上可以更容易地完成。这里有两个选项:

    • 使用 linux cli 调用程序(如果 nightmare 脚本运行良好,请忽略 xvfb 警告):

      • xvfb-run -a node main.js。或者……

      • 如果使用与渲染相关的功能,例如截屏:xvfb-run -a --server-args="-screen 0 1280x1028x24 -ac +extension GLX +extension RANDR +render" node app.js。谷歌 xvfb 选项以适应您的口味。

    • 以编程方式:使用xvfb npm package

    从现在开始,你应该可以在 linux 上运行 nightmare 了。

    第 2 部分)

    应用引擎上的 Nodejs 通过灵活的环境运行。意思是,通过 docker 容器。

    来自 GAE nodejs 运行时:“如果您的应用程序需要额外的操作系统级依赖项,您将需要使用基于此运行时的自定义运行时来安装适当的包。”

    Docker 是一个完全独立的主题,但据我所知,要使用应用引擎执行上述操作,您有两个选择:

    1. Extending the runtime

    2. 从头开始使用带有custom runtime 的 GAE。

    无论哪种方式,基本上您需要做的是安装在 dockerfile 中定义它们的 xvfb 相关包,这样就可以解决问题。

    祝你好运!

    重要提示:

    1. 上述 apt-get 软件包取决于 linux 发行版的可用性(上述代码适用于 ubuntu 和 debian)。例如,使用指定的软件包集,并且在本文发布时,它将与 GAE 的灵活环境一起使用,因为它基于 debian jessie 而无法在 linux alpine 上运行。

    2. Chromium 需要最低限度的 dev/shm 分配才能正常运行。例如,在 heroku 上,它固定为 5mb - 并且无法更改它。 Chromium 会在几次噩梦般的操作后崩溃。所以铬不会在任何大小的任何heroku的测功机上工作。在 docker 中,它设置为 64mb,因此根据脚本的复杂性,您可以做得很好或需要调整它。在普通的 linux 安装中,dev/shm 通常设置为总可用内存的一半。因此,在 512mb 的环境中,dev/shm 将设置为 256mb,并且 nightmare 很可能运行良好。

    【讨论】:

    • 值得注意的是,您不能在 appengine 上更改 /dev/shm。
    【解决方案2】:

    感谢@rickmed 的详尽回答!它帮助我开始掌握在这种情况下使用 xvfb 的方法。 (https://stackoverflow.com/a/37663861/562915)

    我正在使用 Nightmare 从端点生成 PDF。我的本地开发是在 OSX 上完成的,我在尝试让它在 Google App Engine 上工作时遇到了这个问题。我最初使用 rickmed 的答案使其工作,并且后来找到了另一种避免自定义 Dockerfile/运行时的方法。我想我会在这里分享。

    我没有使用自定义 Dockerfile,并允许 gcloud 在部署期间为我生成一个。我的 yaml 文件使用runtime: nodejs。对于我对 Nightmare 的简单使用,我可以将预安装脚本添加到我的 package.json 并更新启动脚本。这就是我在 GAE 上做噩梦所需要的一切。以下是我的 package.json 中的相关行:

    {
      "scripts": {
        "preinstall": "apt-get update && apt-get install -y libgtk2.0-0 libgconf-2-4 libasound2 libxtst6 libxss1 libnss3 xvfb",
        "start": "xvfb-run -a node build/server/index",
        ...
      },
      ...
    }
    

    我从 otaviomedeiros 的评论中提取了一组简化的 apt-get 安装包:https://github.com/segmentio/nightmare/issues/224#issuecomment-225887320

    我从 Daishi Kato 的有用文章中得到了这个想法:https://medium.com/google-cloud/how-to-use-phantomjs-with-node-js-on-google-app-engine-6f7feaea551#.6eoyvpn93,这篇免责声明包含在文章中:

    虽然下面的程序在编写时效果很好,但这并不意味着它会持续很长时间。我什至不确定是否推荐。请理解风险。

    因此,就这样吧,希望它能对某人有所帮助!

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2016-05-12
      • 2011-02-27
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      相关资源
      最近更新 更多