8

There is famous issue with nightmare and electron not running on headless linux servers. The official electron docs suggest to use xvfb in order to fake the display. They suggest to use this .yml file for travis.

addons:
  apt:
    packages:
      - xvfb

install:
  - export DISPLAY=':99.0'
  - Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &

Question

How can I use the above piece of code into app.yaml file of google appengine for node.js. I have tried to use this as it is, but glcoud throws an error that addon is invalid command. The gap official docs don't have any similar command.

Any suggestions how we can run nightmare and electron on google appengine for node.js..?

4

2 回答 2

13

这个问题有两个部分:

  1. 在 Linux 上无头运行铬(电子和噩梦“使用”的东西)。
  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 包

从这一点开始,您应该能够在 linux 上运行 nightmare。

第2部分)

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

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

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

  1. 扩展运行时

  2. 从头开始使用带有自定义运行时的 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 很可能运行良好。

于 2016-06-06T17:53:09.237 回答
3

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

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

我没有使用自定义 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和这个免责声明包含在文章中:

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

所以把它当作它是什么,希望它会帮助别人!

于 2016-07-19T00:01:56.953 回答