2026年7月27日
2026年7月27日
VPSにchromeheadlessをインストールする方法
はじめに
ChromeにはGUIなしで起動できる「Headlessモード」があり、PDF生成・スクリーンショット取得・E2Eテスト・スクレイピングなどに広く使われます。Node.jsから扱うPuppeteerやPlaywrightと組み合わせれば、複雑なJavaScriptを実行する現代のWebサイトにも対応できます。
本記事ではUbuntu 22.04を例に、Google Chrome安定版(または Chrome for Testing)の導入、依存ライブラリ・日本語フォント・サンドボックス設定、Puppeteerでの動作確認までを実例で解説します。
VPSでは共有メモリ(/dev/shm)容量が小さい問題やUbuntu/Debianの sandbox 設定がしばしばつまずきポイントです。
症状・背景
- Puppeteerが「Failed to launch the browser process」で起動しない
- Chrome実行時に共有メモリ不足のエラーが頻発する
- ヘッドレスでスクリーンショットを取りたいが日本語が豆腐になる
- Dockerなしでも動かしたい
手順・設定方法
ステップ1: Google Chrome(安定版)をインストール
# 公式リポジトリのGPG鍵を追加
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/google-chrome.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
sudo apt update
sudo apt install -y google-chrome-stable
# バージョン確認
google-chrome --version
ステップ2: 依存ライブラリと日本語フォント
# Chromiumが要求するライブラリを揃える
sudo apt install -y \
libnss3 libxss1 libasound2 libatk1.0-0 libatk-bridge2.0-0 \
libcups2 libdrm2 libgbm1 libgtk-3-0 libxshmfence1 libxkbcommon0
# 日本語フォント
sudo apt install -y fonts-noto-cjk fonts-noto-color-emoji
sudo fc-cache -fv
# /dev/shm 不足対策(一時的に拡張)
sudo mount -o remount,size=1G /dev/shm
ステップ3: コマンドラインでスクリーンショットを取得
# サンドボックス無効・ヘッドレスで起動してスクショ保存
google-chrome \
--headless=new \
--no-sandbox \
--disable-gpu \
--hide-scrollbars \
--window-size=1280,800 \
--screenshot=/tmp/example.png \
https://example.com
# PDFを生成
google-chrome --headless=new --no-sandbox \
--print-to-pdf=/tmp/example.pdf https://example.com
ls -lh /tmp/example.*
ステップ4: Puppeteerでの動作確認
# Node.js LTS 導入
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# プロジェクト作成
mkdir ~/scraper && cd ~/scraper && npm init -y
npm install puppeteer-core
# Puppeteerからシステムインストール済Chromeを使うサンプル
cat > capture.js <<'EOF'
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/usr/bin/google-chrome',
args: ['--no-sandbox', '--disable-dev-shm-usage'],
headless: 'new'
});
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'shot.png' });
await browser.close();
})();
EOF
node capture.js && ls -lh shot.png
注意事項
--no-sandboxを使うのは信頼できるサイトのみ。一般用途ではユーザー名前空間を有効にして sandbox を維持--disable-dev-shm-usageを付けると /dev/shm を使わずディスクに書くため共有メモリ不足を回避puppeteerパッケージは独自Chromiumをダウンロードする。VPSの帯域・容量を節約するならpuppeteer-core+ システムChrome- Chromeをルートで実行する必要がある場合のみ
--no-sandbox、それ以外は専用の非rootユーザーで動かす
まとめ
1. google-chrome-stableを公式リポジトリから導入
2. 依存ライブラリ + 日本語フォントを忘れずに揃える
3. --disable-dev-shm-usageで共有メモリ不足を回避
4. Puppeteer-coreでシステムChromeを使い容量節約
5. 専用ユーザー実行でsandboxセキュリティを維持
関連記事: