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

时间:2016-06-04 00:57:56

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

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

addons:
  apt:
    packages:
      - xvfb

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

问题

如何将上述代码用于node.js的google appengine的app.yaml文件中。我试图按原样使用它,但是glcoud会抛出addon无效命令的错误。差距official docs没有任何类似的命令。

我们如何在node.js上为google appengine运行噩梦和电子?

2 个答案:

答案 0 :(得分:12)

这个问题涉及两个部分:

  1. 在Linux上无头地运行铬(什么电子,反过来,噩梦“使用”)。
  2. 安装/使用xvfb在app引擎上运行chrome。
  3. 第1部分)

    你需要xvfb。

    Xvfb(Virtual Framebuffer)只是一个程序,来自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的环境变量,指向它。电子中的铬会自动寻找$ DISPLAY。

    以上可以更轻松地完成。这有两个选择:

    • 使用linux cli调用程序(如果恶梦脚本运行良好,请忽略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上运行噩梦。

    第2部分)

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

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

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

    1. Extending the runtime

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

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

      祝你好运!

      重要说明:

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

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

答案 1 :(得分: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得到了这个想法,这篇免责声明包含在文章中:

  

虽然以下程序在编写时效果很好,但这并不意味着它会长时间工作。我甚至不确定是否推荐。请了解风险。

所以请把它当作它,并希望它会帮助别人!