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

梦魇和电子没有在无头Linux服务器上运行着名的问题 。 官方电子文档build议使用xvfb来伪造显示。 他们build议为travis使用这个.yml文件。

插件:
  易于:
    包:
       -  xvfb

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

如何将上面的代码用于node.js的google appengine的app.yaml文件中 我试图用它,因为它是,但glcoud抛出一个错误,即addon是无效的命令。 差距官方文档没有任何类似的命令。

任何build议如何我们可以运行恶梦和电子谷歌appengine为node.js ..?

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

  1. 在linux上无所事事地运行着铬(什么电子,反过来又是恶梦“使用”)。
  2. 安装/使用xvfb在app引擎上运行铬。

第1部分)

你需要xvfb。

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

无需屏幕输出即可运行浏览器。

首先,安装所有的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的时候​​,你需要创build一个虚拟的xvfb屏幕并导出一个名为DISPLAY的环境variables来指向它。 电子中的铬将自动寻找$ DISPLAY。

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

  • 使用linux cli调用程序(如果恶梦脚本运行正常,则忽略xvfb警告):

    • xvfb-run -a node main.js 要么…

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

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

从这一点上你应该可以在linux上运行恶梦。

第2部分)

应用程序引擎上的Nodejs通过灵活的环境运行。 意思是通过docker集装箱。

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

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

  1. 延长运行时间

  2. 从头开始使用自定义运行时 GAE。

无论哪种方式,基本上你需要做的是安装在dockerfile中定义它们的xvfb相关包,应该做的伎俩。

祝你好运!

重要笔记:

  1. 上面的apt-get包依赖于Linux发行版的可用性(上面的代码在Ubuntu和Debian上运行)。 例如,在指定的软件包集合以及本文发布时,它将与GAE灵活的环境一起工作,因为它基于debian jessie,不会在linux上运行。

  2. 铬需要一个最低的dev / shm分配才能正常运行。 例如,在heroku上它被固定为5MB,并且无法改变它。 铬几个噩梦行动后将崩溃。 所以铬不会在任何尺寸的heroku的dynos上工作。 在docker它被设置为64MB,所以根据你的脚本的复杂性,你会做的很好或需要调整它。 在简单的linux安装中,dev / shm通常设置为总可用内存的一半。 所以在512MB的环境下,dev / shm将会被设置为256mb,而噩梦很可能会正常运行。

感谢@rickmed他彻底的答案! 它帮助我开始在这个上下文中使用xvfb。 ( https://stackoverflow.com/a/37663861/562915

我使用恶梦从端点生成PDF的。 我的本地开发是在OSX上完成的,我在尝试使它在Google App Engine上工作时遇到了这个问题。 我得到它最初与rickmed的答案工作,并已经find了另一种方式,避免了自定义Dockerfile /运行时。 我以为我会在这里分享。

我没有使用自定义Dockerfile,并允许gcloud在部署期间为我生成一个。 我的yaml文件使用runtime: nodejs 。 对于我简单的使用梦魇,我可以添加一个预安装脚本到我的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免责声明包含在文章中:

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

所以,就拿这个来说吧,希望它能帮助别人!