CentOS7でpuppeteerを使用する方法

2018年1月27日

はじめに

Phantom JSを長らく使ってきたけれど、24時間稼働のアプリケーションに使用していると、時々落ちてしまう。
どうしたものかと悩んでいたら、Headless Chromeが使用できるようになったので、そちらに切り替えをしている。

Headless ChromeをNode.JSで使用するときは、Googleのライブラリpuppeteerを使う。

すんなりと使えればいいんだけど、CentOS7で使用するときは、ちょっとしたコツがいります。
普通に、npm install --save puppeteerでインストールして、使用するとひたすらエラーが出ます。

使用方法は、GitHubのIssueに書かれています。
https://github.com/GoogleChrome/puppeteer/issues/391

上のリンクの方法で、うまく行ったので、記録として残しておきます。

周辺パッケージのインストール

Chrome(Chromium)を動かすために、CentOSのパッケージのいくつがが必要になります。
インストールするパッケージは、下記のとおりです(すごく多いので、コピペでインストールしました)。

$ yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc

Chromiumのインストール

CentOS7では、Chromeが動かないようなので、代わりにChromiumをインストールします。
インストールディレクトリは、適宜変えてください。

$ cd /home/chromium
$ git clone https://github.com/scheib/chromium-latest-linux .
$ ./update.sh

Sandboxの問題回避

ChromiumのSandboxで使用するディレクトリだけ、権限をrootに変更します。
また、環境変数で、Sandboxのディレクトリを指定します。

$ cd /home/chromium/latest
$ chown yourID:yourID *

# Need root permission
$ chown root:root chrome_sandbox && chmod 4755 chrome_sandbox
$ export CHROME_DEVEL_SANDBOX="/home/chromium/latest/chrome_sandbox"

puppeteerのインストール

puppeteerのインストールをします。デフォルト設定だと、Chromeをローカルへインストールしようとするので、環境変数でChromiumを使用することを伝えます。

$ export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
$ npm install --save puppeteer```

実行時にChromiumを指定

puppeteerの実行時に、Chromiumを指定して実行します。

const puppeteer = require('puppeteer')

// 実行するときのコード
const browser = await puppeteer.launch({ executablePath: '/home/chromium/latest/chrome' });

実際は、config等にして、chromiumを指定できるようにすると思います。

少し手順が長いですが、これでCentOS7でもpuppeteerを使用することができます。

蛇足

PhantomJSで書いていたコードをpuppeteerで書き直しました。
PhantomJSを使用していたときには、24時間稼働のシステムが1週間くらいで落ちていました(24時間じゃないじゃん)。
puppeteerで書き直したところ、無事に落ちることはなくなりました。

Headless Chromeさまさまです。