前提:正直に言うと「普通には動かない」
まず結論から言うと、ExpressをXserverで「普通のWebサーバーのように常駐起動する」のはできません。
理由はシンプルです。
ポートが自由に使えない
常駐プロセスが制限される
つまり app.listen(3000) のような典型的な構成はそのままでは不可能です。
ここを誤解したまま進むと必ず詰みます。
ではどうするかというと、「無理やり動かす」には発想を変えます。
全体戦略:Expressを“サーバー”としてではなく“関数”として使う
発想の転換
通常のExpressはこうです。
リクエストが来る
サーバーが受け取る
レスポンスを返す
しかしXserverでは常駐できないので、こう変えます。
リクエストが来る(Apache)
Node.jsを一瞬起動する
処理してすぐ終了する
つまり「CGIとして実行」します。
方法1:Node.js CGIでExpressを動かす
CGIとは何か
CGIは「リクエストごとにプログラムを起動する仕組み」です。
古いですが、制限環境では最も確実に動きます。
Step1:CGIを有効化
Xserverのサーバーパネルで
「CGI設定」→ ON
対象ディレクトリに .htaccess を置きます。
Options +ExecCGI
AddHandler cgi-script .js
ApacheStep2:Node実行パスを確認(重要)
which node
例:
/home/ユーザー名/.nvm/versions/node/v18.x.x/bin/node
このパスは後で必須です。
Step3:CGI対応Expressコードを書く
ここが核心です。
通常のExpressコードは使えません。
HTTPサーバーを立てず、「1リクエスト処理」に書き換えます。
#!/home/ユーザー名/.nvm/versions/node/v18.x.x/bin/node
const express = require("express");
const app = express();
// 疑似レスポンス
const res = {
send: (body) => {
console.log("Content-Type: text/html\n");
console.log(body);
}
};
// 疑似リクエスト(簡易)
const req = {
url: process.env.REQUEST_URI || "/"
};
// ルーティング
app.get("/", (req, res) => {
res.send("<h1>Hello Express on Xserver</h1>");
});
// 擬似的に処理実行
app._router.handle(req, res, () => {});
JavaScriptStep4:実行権限を付与
chmod 755 app.js
Step5:ブラウザでアクセス
https://あなたのドメイン/app.js
これで動けば成功です。
方法2:リバースプロキシ的な“擬似運用”(応用)
考え方
Xserverでは直接ポート公開は無理なので
外部VPSでExpress起動
Xserverはフロントとして使う
という構成にします。
Apacheから外部APIとして叩く形です。
イメージ
Xserver(フロント)
↓
VPS(Node.js + Express)
メリット
本来のExpressが使える
高速
リアルタイム処理可能
デメリット
サーバーが2つ必要
初心者には難しい
方法3:cronで擬似Webアプリ化(現実的)
これは実務でよく使う
Expressを「APIサーバー」としてではなく
データ生成
HTML生成
バッチ処理
に使います。
例
一定時間ごとにHTMLを生成
node generate.js > public/index.html
これをcronで回す
なぜ有効か
Xserverは「静的配信は強い」からです。
つまり
動的処理 → Node
公開 → HTML
に分離するのが最適解です。
セキュリティとパフォーマンス(重要な深堀り)
CGI方式の弱点
毎回Nodeが起動するので
遅い
負荷が高い
つまりアクセスが増えると破綻します。
対策
重い処理は避ける
キャッシュを使う
HTMLを事前生成する
セキュリティ
CGIは外部入力を直接扱うため危険です。
特に注意する点
クエリパラメータの検証
ファイル操作の制限
外部APIの扱い
まとめ:本当に使うべきか
ここははっきり言います。
「無理やり動かす」は学習には良いですが、実務には向きません。
本当にやりたいこと別の最適解はこうです。
ExpressでWebサービスを作る → VPS
簡単な処理 → Xserver + Node
高速サイト → 静的生成
