💡 Tips

ConoHa WINGにNode.js/Expressをデプロイする手順【個人開発2025】

結論:ConoHa WINGでもExpressは動く。ただし一手間必要

ConoHa WINGはWordPress向け共用ホスティングとして知られていますが、SSH接続・Node.js実行・pm2による常駐を組み合わせれば、Express APIサーバーを動かすことができます。

ただし「サーバーレスにポンと置くだけ」とはいかず、リバースプロキシ設定など数ステップの作業が必要です。本記事では2025年時点の手順を実際の操作ベースで解説します。


前提・環境

項目内容
プランConoHa WING ベーシック以上(SSH有効プラン)
Node.js バージョン20.x LTS(サーバー上のバージョンを後で確認)
フレームワークExpress 4.x
プロセス管理pm2
公開方法.htaccess + mod_proxy によるリバースプロキシ

注意: ConoHa WINGは共用ホスティングのため、ポートを外部に直接公開することはできません。Apacheのリバースプロキシを経由してExpressへ転送する構成が必須です。


ステップ1:SSHでConoHa WINGに接続する

ConoHaコントロールパネル → 「サーバー管理」→「SSH」からSSH接続情報を確認します。

ssh -p 22 アカウント名@サーバーIPアドレス

初回接続時に鍵認証の設定を推奨します。パスワード認証はコントロールパネルで有効化できます。

接続後、Node.jsが利用できるか確認します。

node -v   # 例: v20.11.0
npm -v    # 例: 10.x.x

バージョンが古い場合は nvm を使って切り替えます。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20
node -v   # v20.x.x

ステップ2:Expressアプリをサーバーへ転送する

ローカルでアプリを作成しておきます。

# ローカル
mkdir my-api && cd my-api
npm init -y
npm install express
// index.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

app.use(express.json());

app.get('/api/hello', (req, res) => {
  res.json({ message: 'Hello from ConoHa WING!' });
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

node_modules は転送せず、package.json だけ送って npm install するのがベストです。

# ローカル: scp でファイルを転送
scp -P 22 -r ./my-api アカウント名@サーバーIP:~/apps/my-api

サーバー上で依存関係をインストールします。

cd ~/apps/my-api
npm install --production

ステップ3:pm2でExpressを常駐させる

プロセスマネージャー pm2 を使うことで、SSHを切断しても動き続けます。

npm install -g pm2

# アプリ起動
pm2 start index.js --name my-api

# サーバー再起動時に自動起動するよう登録
pm2 startup
pm2 save

動作確認:

pm2 list
pm2 logs my-api

curl http://localhost:3000/api/hello でレスポンスが返ればOKです。


ステップ4:.htaccessでリバースプロキシを設定する

ConoHa WINGのApacheは mod_proxy が有効なので、.htaccess でExpressへのプロキシを記述できます。

公開ディレクトリ(例:/home/アカウント名/public_html/api/)に .htaccess を配置します。

# /public_html/api/.htaccess
Options -Indexes
RewriteEngine On

# Express (port 3000) へプロキシ
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://localhost:3000/$1 [P,L]

# プロキシヘッダの転送
ProxyPassReverse / http://localhost:3000/

設定後、https://あなたのドメイン/api/hello にアクセスしてJSONが返ればデプロイ完了です。

トラブル時の確認ポイント

  • pm2 list でステータスが online になっているか
  • ポート番号が .htaccessindex.js で一致しているか
  • .htaccess が正しいディレクトリに置かれているか

ステップ5:デプロイを自動化する(GitHub Actions)

毎回 scp するのは手間なので、GitHub Actionsで自動デプロイを組みます。

# .github/workflows/deploy.yml
name: Deploy to ConoHa WING

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: rsync to server
        uses: burnett01/rsync-deployments@7.0.1
        with:
          switches: -avzr --exclude='node_modules'
          path: ./
          remote_path: ~/apps/my-api/
          remote_host: ${{ secrets.SERVER_IP }}
          remote_user: ${{ secrets.SERVER_USER }}
          remote_key: ${{ secrets.SSH_PRIVATE_KEY }}

      - name: npm install & pm2 reload
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd ~/apps/my-api
            npm install --production
            pm2 reload my-api

GitHub リポジトリの Settings → Secrets に SERVER_IPSERVER_USERSSH_PRIVATE_KEY を登録するだけです。


ConoHa WING vs Vercel:個人開発での使い分け

同じNode.jsを動かすにしても、用途によって最適解は変わります。

観点ConoHa WINGVercel
向いているAPI長時間処理・WebSocket・DB常時接続短命なAPIルート(数秒以内)
料金月額固定(ベーシック:約1,000円〜)無料枠あり、従量課金
サーバー制御SSH で自由に設定可能ほぼブラックボックス
デプロイ手間やや高い(pm2・htaccess等)ゼロコンフィグ
静的サイト+APIWordPressと同居しやすいNext.js との相性抜群
長期コスト安定(値上がりリスク低)無料枠超過で急騰する場合も

判断の目安

  • WordPressや静的サイトと同じドメインでAPIを動かしたい → ConoHa WING
  • Next.js / Nuxt.js を使ったフルスタックアプリ → Vercel
  • WebSocket・常駐バッチが必要 → ConoHa WING(またはVPS)
  • とにかく早くプロトタイプを公開したい → Vercel

Node.jsやExpressの設計パターンをより深く学びたい方には、書籍での体系的なインプットもおすすめです。

📚 おすすめ書籍

Node.js デザインパターン 第3版

設計の引き出しが増えてコードの質が上がる定番書

Amazonで見る →

よくあるトラブルと対処法

502 Bad Gateway が出る

→ pm2 が起動していない、またはポートが違う。pm2 list.htaccess のポート番号を確認。

pm2 を再起動するとアプリが止まる

pm2 startuppm2 save を実行し忘れている。

EACCES: permission denied でポートにバインドできない

→ 共用ホスティングでは1024番以下のポートは使用不可。3000番台を使うこと。

環境変数をどこに書く?

pm2 start index.js --env production で渡すか、ecosystem.config.jsenv セクションに記述します。.env ファイルは dotenv パッケージで読み込めます。


まとめ

ConoHa WINGでExpressをデプロイする流れをおさらいします。

  1. SSH接続 → nvmでNode.jsバージョン管理
  2. アプリ転送 → scp または GitHub Actions
  3. pm2で常駐化pm2 startup で自動起動
  4. .htaccessでリバースプロキシ → 外部からアクセス可能に
  5. GitHub Actionsで自動デプロイ → pushするだけで反映

Vercelの手軽さには及びませんが、WordPressと同一サーバーでAPIを管理したい・長期コストを抑えたい・WebSocketを使いたいといったニーズにはConoHa WINGが有力な選択肢です。

個人開発でサーバーをもっと自由に使いたいなら、ぜひ試してみてください。