1つのコマンドで複数の Node.js サーバを起動する
$ node start-servers.js
みたいな感じで、1つのコマンドを叩くだけで、複数のポートを使用した Node.js サーバを起動できないかなぁ〜と思っていた。
つまり、例えば、1つのコマンドを叩くだけで、
http://localhost:3000/
でメインの Web アプリを見られるようにし、http://localhost:8888/
で管理ツールの Web アプリを見られるようにし、https://localhost:8443/
で HTTPS サーバも見られるようにしたい
ということだ。
これまではサーバを起動する 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/');
server1
・server2
は書き方が違うだけで挙動は同じ。server3
は前回紹介したオレオレ証明書を使用した HTTPS サーバ。
HTTP サーバと HTTPS サーバの共存も問題なし。
複数サーバを1ファイルで起動したので、$ node start-servers.js
みたいな形で1コマンドで実行できる。閉じる時も Ctrl + C
で3つとも落ちる。コレで良い感じ。