有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运行噩梦和电子?
答案 0 :(得分:12)
这个问题涉及两个部分:
第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引擎执行上述操作,据我所知,您有两个选项:
从头开始使用带custom runtime的GAE。
无论哪种方式,基本上你需要做的是在dockerfile中安装定义它们的xvfb相关包,这应该可以解决这个问题。
祝你好运!重要说明:
上面的apt-get软件包取决于linux发行版的可用性(上面的代码适用于ubuntu和debian)。例如,使用指定的包集合,在本文发布时,它将与GAE的灵活环境一起使用,因为它基于debian jessie,并且不适用于linux alpine。
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得到了这个想法,这篇免责声明包含在文章中:
虽然以下程序在编写时效果很好,但这并不意味着它会长时间工作。我甚至不确定是否推荐。请了解风险。
所以请把它当作它,并希望它会帮助别人!