node.js - 如何在 node.js 的谷歌应用引擎上运行 nightmare.js

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

famous issue Nightmare 和 Electron 不在 headless 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 is invalid command。差距official docs没有任何类似的命令。

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

最佳答案

这个问题有两个部分:

  1. 在 Linux 上 headless 地运行 chromium(electron 和 nightmare“使用的东西”)。
  2. 安装/使用 xvfb 在 App Engine 上运行 Chromium。

第 1 部分)

你需要 xvfb。

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

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

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

apt-get install -y\ xvfb\ x11-xkb-utils\ xfonts-100dpi\ xfonts-75dpi\ xfonts-可缩放\ xfonts-西里尔文\ x11-应用\ 铿锵\ libdbus-1-开发\ libgtk2.0-开发\ libnotify-开发\ libgnome-keyring-dev\ libgconf2-开发\ libasound2-dev\ libcap-开发\ libcups2-开发\ libxtst-开发\ libxss1\ libnss3-开发\ gcc-multilib\ g++-多库

因此,安装 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 部分)

App Engine 上的 Nodejs 通过柔性环境运行。意思是,通过 docker 容器。

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

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

  1. Extending the runtime

  2. 将 GAE 与 custom runtime 结合使用从零开始。

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

祝你好运!

重要提示:

  1. 以上 apt-get 软件包取决于 linux 发行版的可用性(以上代码适用于 ubuntu 和 debian)。例如,在撰写本文时,使用指定的软件包集,它将在 GAE 的灵活环境中工作,因为它基于 debian jessie 而不能在 linux alpine 上工作。

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

关于node.js - 如何在 node.js 的谷歌应用引擎上运行 nightmare.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37625327/

相关文章:

javascript - 在 Node.js 中监听所有发出的事件

node.js - 如何调试 aws lambda 函数?

node.js - Mocha 运行正确,但显示未定义

java - Datanucleus 警告 : Class was specified in persistence-unit but not annotated, 所以忽略

Go:解析变体 YAML

java - Spring Boot 从配置文件加载列表返回空列表

node.js - 如何修复 "dyld: Library not loaded:/usr/lib/libc++.1.dylib Referenced from:/usr/local/bin/node Reason: image not found Trace/BPT trap"

Java数据存储批量删除实体

google-app-engine - 即使修改了 html 页面,应用程序引擎也返回 304

android - Flutter 代码库在 GitHub Actions 中构建 APK 返回 'undefined: No tag found in ref or input!'