1つのコマンドで複数の Node.js サーバを起動する

$ node start-servers.js みたいな感じで、1つのコマンドを叩くだけで、複数のポートを使用した Node.js サーバを起動できないかなぁ〜と思っていた。

つまり、例えば、1つのコマンドを叩くだけで、

ということだ。

これまではサーバを起動する Node.js ファイルを複数作っていたので、$ node server1.js & node server2.js みたいに並列実行すればいいのか…?とか思っていたのだけど、Node.js サーバは1つの JS ファイルから複数 listen() (= 起動) できることに気が付き、以下のようにやってみた。

const http  = require('http');
const https = require('https');
const fs    = require('fs');

// 一気に繋げて書いた場合
const server1 = http.createServer((req, res) => {
  console.log('Port 3000');
  res.writeHead(200);
  res.end('Hello World : 3000');
}).listen(3000);

// 分けて書いた場合
const server2 = http.createServer();
server2.on('request', (req, res) => {
  console.log('Port 8888');
  res.writeHead(200);
  res.end('Hello World : 8888');
});
server2.listen(8888);

// HTTPS サーバも混ぜてみる
const server3 = https.createServer({
  key : fs.readFileSync('key.pem'),
  cert: fs.readFileSync('cert.pem')
}, (req, res) => {
  console.log('HTTPS Port 8443');
  res.writeHead(200);
  res.end('Hello World : 8443 (HTTPS)');
}).listen(8443);

console.log('サーバ起動 :')
console.log('  http://localhost:3000/');
console.log('  http://localhost:8888/');
console.log('  https://localhost:8443/');

server1server2 は書き方が違うだけで挙動は同じ。server3 は前回紹介したオレオレ証明書を使用した HTTPS サーバ。

HTTP サーバと HTTPS サーバの共存も問題なし。

複数サーバを1ファイルで起動したので、$ node start-servers.js みたいな形で1コマンドで実行できる。閉じる時も Ctrl + C で3つとも落ちる。コレで良い感じ。