有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 有什么建议吗?
最佳答案
这个问题有两个部分:
- 在 Linux 上 headless 地运行 chromium(electron 和 nightmare“使用的东西”)。
- 安装/使用 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 执行上述操作,据我所知,您有两种选择:
将 GAE 与 custom runtime 结合使用从零开始。
无论哪种方式,基本上您需要做的就是安装在 dockerfile 中定义它们的 xvfb 相关包,这应该可以解决问题。
祝你好运!
重要提示:
以上 apt-get 软件包取决于 linux 发行版的可用性(以上代码适用于 ubuntu 和 debian)。例如,在撰写本文时,使用指定的软件包集,它将在 GAE 的灵活环境中工作,因为它基于 debian jessie 而不能在 linux alpine 上工作。
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/