XserverにNode.jsを導入する方法

Web APP JavaScript
スポンサーリンク

結論:そのままでは動かないので「構造を変えて無理やり動かす」

まず最初に現実をはっきりさせます。

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構成」

このあたりをやると、一気に実務レベルに近づきます。

タイトルとURLをコピーしました