如何在 google appengine 上为 node.js 运行 nightmare.js

Posted

技术标签:

【中文标题】如何在 google appengine 上为 node.js 运行 nightmare.js【英文标题】:How to run nightmare.js on google appengine for node.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 有什么建议吗?

【问题讨论】:

【参考方案1】:

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

    在 linux 上无头运行 chromium(电子和噩梦“使用”的东西)。 安装/使用 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 是一个完全独立的主题,但据我所知,要使用应用引擎执行上述操作,您有两个选择:

    Extending the runtime

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

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

祝你好运!

重要提示:

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

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

【讨论】:

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

感谢@rickmed 的详尽回答!它帮助我开始掌握在这种情况下使用 xvfb 的方法。 (https://***.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#.6eoy***93,这篇免责声明包含在文章中:

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

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

【讨论】:

以上是关于如何在 google appengine 上为 node.js 运行 nightmare.js的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google App Engine(灵活环境)上为应用创建开发服务器?

如何从 Google 的 appengine 动态生成 pdf?

如何在 Google AppEngine 上使用 JDBC

如何在 Google AppEngine 上实现“实时”消息传递?

如何使全局变量在多个 google appengine 实例上保持不变?

如何在没有AppEngine for Google云端存储的情况下获取服务网址?