CentOS6でElectronベースNightmareを動かす

  • 4
    いいね
  • 0
    コメント

結論: Cent7を使いましょう

------------------- ↓ 余談はここから ↓-------------------
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪


PhantomJSのラッパーからスタートしたNightmareというヘッドレスブラウザがある
v1からv2になった時にPhantomJSからElectronベースになった。
PhantomJSについては当方の過去記事でさんざんやったので、
あえてNightmareを使う必要は感じなかったが、
ベースが変わったのなら話は別だ。

ということでさっそく使ってみようとしたが、
インストールで躓いたでのそこを書いてみる。

構成としてはX11をインストールしたサーバーとか持ってないので、
手元にあるCentOS6.7のXvfb上にelectronを動かす流れで。

まず、調べ始めると以下のような記事が出てきた。

HeadlessなLinux環境でNightmare(v2)を動かすためにしたこと

CentOS6.xでは、Electronは動かない

(゚Д゚)!?

開始5秒で終了。。。

いやいや、まだ慌てるときじゃない。
とりあえず、インストールを走らせてみよう。

$ sudo yum install xorg-X11-server-Xvfb
パッケージ xorg-X11-server-Xvfb は利用できません。
  * おそらくの意味: xorg-x11-server-Xvfb
エラー: 何もしません

(゚Д゚)ファ!?

その他エラーが大量に出た。
これは・・・。。。

苦心の末何とか動くところまで持って行けた。
しかし、ことのほかハードルが高く、
glibcをソースからビルドして差し替える事態に。
正直、CentOS7に変えた方が良い。

------------------- ↓ 本題はここから ↓-------------------
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪


CentOSを6.8に更新

上記サイトにはglibcのバージョンが問題だと指摘しているが、
まず手元にあるCentのバージョンアップから始めてみることにした。

$ sudo yum update
http://mirror.centos.org/centos/6/SCL/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"
他のミラーを試します。
To address this issue please refer to the below knowledge base article

https://access.redhat.com/articles/1320623

If above article doesn't help to resolve this issue please open a ticket with Red Hat Support.

(゚Д゚)!?????

今度はなんか別のエラーが出た。
たすけてーエロい人~

以下のサイトを発見。
CentOS 6.7のyum updateでエラー
どうやらCentOS Software Collectionが6系と7系で違うらしい。
CentOS6 : yum install centos-release-SCL
CentOS7 : yum install centos-release-scl
小文字の方に差し替える必要がありそうだ。

とうことでOSをCentOS6.7から6.8にバージョンアップ

$ sudo yum remove centos-release-SCL
$ sudo yum update
$ sudo yum install centos-release-scl
$ sudo yum update 

glibcのビルド

コマンドは大したことないが、
ビルド時間は尋常じゃなくかかる。
サーバのスペックに自信がなければ、
寝る前にビルドすることをお勧めする。

インストール先は/usr/localにする

glibcのビルド

$ wget http://ftp.gnome.org/pub/gnome/sources/glib/2.32/glib-2.32.4.tar.xz
$ tar Jxvf glib-2.32.4.tar.xz
$ cd glib-2.32.4
$ ./configure
$ make
$ sudo make install

gccのビルド

$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.4/gcc-4.8.4.tar.gz
$ tar xvfz 
$ cd gcc
$ ./configure
$ make # ←時間に余裕があるときにビルドするように(筆者は5時間ほどかかった)
$ sudo make install # ←対象ファイルはひとつだけなので手動で切り替えも可

LD_LIBRARY_PATHに/usr/local/libを登録

$ sudo vi /etc/ld.so.conf.d/0default.conf
/usr/local/lib/
/usr/lib/

ldconfig実行

$ sudo ldconfig
$ sudo ldconfig -p | grep libstdc++.so  # 登録確認
libstdc++.so.6 (libc6,x86-64) => /usr/lib64/libstdc++.so.6 
libstdc++.so.6 (libc6) => /usr/local/lib/libstdc++.so.6    ←これが含まれればOK
libstdc++.so (libc6) => /usr/local/lib/libstdc++.so
$ sudo ldconfig -p | grep libgobject  # 登録確認
libgobject-2.0.so.0 (libc6,x86-64) => /usr/local/lib/libgobject-2.0.so.0     ←これが含まれればOK
libgobject-2.0.so.0 (libc6,x86-64) => /lib64/libgobject-2.0.so.0
libgobject-2.0.so (libc6,x86-64) => /usr/local/lib/libgobject-2.0.so
libgobject-2.0.so (libc6,x86-64) => /usr/lib64/libgobject-2.0.so

Xvfbをインストール

さて、最初に戻って仮想X11ディスプレイXvfbをインストールする。
あと、各種x11系のフォントと日本語フォントも入れておく

$ sudo yum install xorg-x11-server-Xvfb "xorg-x11-fonts*"
$ sudo yum -y groupinstall "Japanese Support"

インストールの確認

$ which xvfb-run
/usr/bin/xvfb-run

nodejsのインストール

nightmareもelectronはnodejsベースのデスクトップアプリフレームワーク。
なのでnodejsは別途インストールが必要。

nodejsに関してはバージョンアップが頻繁にあるので、
yumで入れずにnodebrewを使う。
perlが必要なのであらかじめ入れておくように。

$ curl -L git.io/nodebrew | perl - setup
$ cat >> ~/.bashrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
export NODE_PATH=$HOME/.nodebrew/current/lib/node_modules/
$ source ~/.bashrc

Nodejsをインストールする
最新バージョンを入れておく

$ nodebrew install-binary stable
$ node -v
v7.1.0
$ npm -v
3.10.9

nightmareのインストール

electronとnightmareを追加する。
ついでにxvfbの起動ツールxvfb-maybeをインストールする。

$ npm install -g --save-dev electron nightmare

nightmareのページにある動作確認サンプルを動かしてみる

$ vi example.js
var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true });

nightmare
  .goto('http://yahoo.com')
  .type('form[action*="/search"] [name=p]', 'github nightmare')
  .click('form[action*="/search"] [type=submit]')
  .wait('#main')
  .evaluate(function () {
    return document.querySelector('#main .searchCenterMiddle li a').href
  })
  .end()
  .then(function (result) {
    console.log(result)
  })
  .catch(function (error) {
    console.error('Search failed:', error);
  });
$ DEBUG=* node example.js
nightmare queuing process start +0ms
nightmare queueing action "goto" for http://www.yahoo.com +127ms
nightmare queueing action "type" +13ms
nightmare queueing action "click" +0ms
nightmare queueing action "wait" +0ms
nightmare queueing action "evaluate" +0ms
nightmare queueing action "screenshot" +1ms
nightmare running +1ms
nightmare electron child process exited with code 1: general error - you may need xvfb +143ms
nightmare electron child process not started yet, skipping kill. +2ms

仮想Xウィンドウ越しに実行

$ xvfb-run node example.js

URLを適当なローカルサイトに変えたら、
ちゃんとアクセスしてるっぽい

はっきり言って環境に選択肢がある人はさっさと別のOS用意してやることを推奨。

------------------- ↓ 後書はここから ↓-------------------
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪


尋常じゃなく苦労したのはやっぱりgcc周りだろう。
正直、こんだけ苦労してやる必要あったのかと思えるぐらい。

ここではこの場で発生したエラーを紹介しよう

nightmare実行後のlibXssエラー

$ DEBUG=* node nightmare.js
・・・
  nightmare running +1ms
electron:stderr /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron:
 error while loading shared libraries: libXss.so.1:
 cannot open shared object file: No such file or directory +63ms
  nightmare electron child process exited with code 127: command not found 
   - you may not have electron installed correctly +7ms
  nightmare electron child process not started yet, skipping kill 

スクリーンセーバモジュールが足りないらしい
それを入れればクリア

$ sudo yum install libXScrnSaver-devel

nightmare実行後のGLIBCXX_3.4.15エラー

$ DEBUG=* node nightmare.js
・・・
  nightmare running +1ms
  electron:stderr /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron) +201ms
  electron:stderr /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron) +2ms
  electron:stderr /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.5' not found (required by /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron) +1ms
  electron:stderr /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/libnode.so) +15ms
  nightmare electron child process exited with code 1: general error - you may need xvfb +72ms
  nightmare electron child process not started yet, skipping kill. +2ms

これマジきつかった~。
このサイトなかったら詰んでた

CentOS6 の libstdc++ を更新する

今回はldconfigでドバーっと登録したけど、
神経質な人は上記ページのようにシンボリックリンクを差し替えるとよい

nightmare実行後の undefined symbol: g_bytes_unref エラー

$ DEBUG=* node nightmare.js
・・・
  nightmare running +1ms
  electron:stderr /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron: symbol lookup error: /home/dozo/.nodebrew/node/v5.5.0/lib/node_modules/electron/dist/electron: undefined symbol: g_bytes_unref

長時間のビルドの末実行した後に出たエラーだったので気絶しそうになったわ。
glibcのバージョン2.32以降じゃなきゃダメらしく、
yumで入れた2.28では対応不可だった。
こっちはビルドしてからどうしようって感じやった。