結論:そのままでは動かないので「構造を変えて無理やり動かす」
まず最初に現実をはっきりさせます。
Expressは本来「常駐サーバー」です。
つまりポートを開いて待ち受ける設計です。
一方でXserverは
常駐プロセス禁止
ポート開放不可
という制約があります。
この時点で「普通のExpress」は動きません。
ではどうするか。
「リクエストごとに起動 → 処理 → 終了」というCGI的な動かし方に変換します。
ここが最大のポイントです。
全体構成:擬似的にExpressを動かす仕組み
仕組みのイメージ
通常のExpress
ブラウザ → Nodeサーバー(常駐) → レスポンス
Xserverでの強引な構成
ブラウザ → Apache(Xserver) → CGI起動 → Node実行 → レスポンス
つまり「Nodeを毎回起動する」形にします。
この時点で分かる重要な事実があります。
パフォーマンスは悪い
リアルタイム処理は不向き
用途は限定されます。
Step1:Node.js環境は事前に構築済みである前提
これは前段階です。まだならここで止まります。
Nodeが動くこと
node -v
npmが動くこと
npm -v
ここが通らないなら先に環境構築が必要です。
Step2:Expressアプリを作る(ただし書き換える)
通常のExpress(これは使えない)
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello Express');
});
app.listen(3000);
JavaScriptこの listen() がアウトです。
CGI対応に書き換える
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello from Node CGI');
});
server.emit('request', {
url: '/',
method: 'GET'
}, {
writeHead: (code, headers) => {
console.log(`Status: ${code}`);
for (let key in headers) {
console.log(`${key}: ${headers[key]}`);
}
console.log('');
},
end: (body) => {
console.log(body);
}
});
JavaScriptここでやっていることは重要です。
HTTPレスポンスを「標準出力」に書き出しているだけです。
CGIは「標準出力=レスポンス」だからです。
Step3:CGIとして動かす
CGIファイルを作る
nano index.cgi
#!/usr/bin/env node
その下にNodeコードを書きます。
重要なのは1行目です。これがないと動きません。
実行権限を付ける
chmod 755 index.cgi
ここは絶対に必要です。
Step4:.htaccessでCGIを有効化
Options +ExecCGI
AddHandler cgi-script .cgi
Apacheこれで .cgi が実行されます。
Step5:ブラウザでアクセス
https://あなたのドメイン/index.cgi
これで表示されれば成功です。
Step6:Expressっぽくする(ここが応用)
実はExpressはそのまま使えない
理由は単純です。
Expressは内部でサーバーを立てる前提だからです。
つまり
app.listen() に依存している
ここを回避しないといけません。
疑似Expressの作り方
軽量ルーターを自作します。
const url = require('url');
const routes = {
'/': () => 'Home',
'/about': () => 'About Page'
};
const path = url.parse(process.env.REQUEST_URI).pathname;
console.log('Content-Type: text/plain\n');
if (routes[path]) {
console.log(routes[path]());
} else {
console.log('404 Not Found');
}
JavaScriptこれで「ルーティングっぽいこと」ができます。
深堀り:なぜこの方法はおすすめしないのか
理由1:パフォーマンスが致命的
リクエストごとに
Node起動
JS読み込み
処理
終了
これはかなり重いです。
理由2:スケーラビリティがゼロ
同時アクセスに弱いです。
Webアプリとしては致命的です。
理由3:セキュリティリスク
CGIは古い仕組みで、設定ミスがあると危険です。
特に注意点
環境変数の扱い
入力値の検証
権限設定
現実的な代替案(重要)
正直に言うと、以下の方が正解です。
VPSを使う
Conoha VPS
さくらのVPS
これなら
Expressそのまま動く
ポート開放OK
常駐OK
まとめ:この技術の本質
今回の方法は
「Expressを動かす」ではなく
「NodeをCGIとして無理やり使う」
です。
つまり別物です。
理解すべきポイントは
サーバーの制約に合わせて設計を変える
ここです。
もし次に進むなら
「VPSでExpressを本番運用する手順」
「Nginx + Node構成」
このあたりをやると、一気に実務レベルに近づきます。
