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になっているか- ポート番号が
.htaccessとindex.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/[email protected]
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/[email protected]
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_IP・SERVER_USER・SSH_PRIVATE_KEY を登録するだけです。
ConoHa WING vs Vercel:個人開発での使い分け
同じNode.jsを動かすにしても、用途によって最適解は変わります。
| 観点 | ConoHa WING | Vercel |
|---|---|---|
| 向いているAPI | 長時間処理・WebSocket・DB常時接続 | 短命なAPIルート(数秒以内) |
| 料金 | 月額固定(ベーシック:約1,000円〜) | 無料枠あり、従量課金 |
| サーバー制御 | SSH で自由に設定可能 | ほぼブラックボックス |
| デプロイ手間 | やや高い(pm2・htaccess等) | ゼロコンフィグ |
| 静的サイト+API | WordPressと同居しやすい | Next.js との相性抜群 |
| 長期コスト | 安定(値上がりリスク低) | 無料枠超過で急騰する場合も |
判断の目安:
- WordPressや静的サイトと同じドメインでAPIを動かしたい → ConoHa WING
- Next.js / Nuxt.js を使ったフルスタックアプリ → Vercel
- WebSocket・常駐バッチが必要 → ConoHa WING(またはVPS)
- とにかく早くプロトタイプを公開したい → Vercel
Node.jsやExpressの設計パターンをより深く学びたい方には、書籍での体系的なインプットもおすすめです。
よくあるトラブルと対処法
502 Bad Gateway が出る
→ pm2 が起動していない、またはポートが違う。pm2 list と .htaccess のポート番号を確認。
pm2 を再起動するとアプリが止まる
→ pm2 startup と pm2 save を実行し忘れている。
EACCES: permission denied でポートにバインドできない
→ 共用ホスティングでは1024番以下のポートは使用不可。3000番台を使うこと。
環境変数をどこに書く?
→ pm2 start index.js --env production で渡すか、ecosystem.config.js の env セクションに記述します。.env ファイルは dotenv パッケージで読み込めます。
まとめ
ConoHa WINGでExpressをデプロイする流れをおさらいします。
- SSH接続 → nvmでNode.jsバージョン管理
- アプリ転送 → scp または GitHub Actions
- pm2で常駐化 →
pm2 startupで自動起動 .htaccessでリバースプロキシ → 外部からアクセス可能に- GitHub Actionsで自動デプロイ → pushするだけで反映
Vercelの手軽さには及びませんが、WordPressと同一サーバーでAPIを管理したい・長期コストを抑えたい・WebSocketを使いたいといったニーズにはConoHa WINGが有力な選択肢です。
個人開発でサーバーをもっと自由に使いたいなら、ぜひ試してみてください。