Node.jsサーバーのポート取得方法
JavaScript, Node.js, Express: サーバーのポートを取得する方法
Node.jsでサーバーを立ち上げるときに、そのサーバーがどのポートでリスンしているかを調べる方法について説明します。
Express.jsを使用する場合
Express.jsはNode.jsのWebアプリケーションフレームワークです。サーバーのポートを取得するには、app.listen()
メソッドのコールバック関数を使用します。
const express = require('express');
const app = express();
const port = 3000;
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
() => { ... }
: サーバーが起動した後に実行されるコールバック関数です。この中でport
変数をログに出力することで、サーバーのポートを取得できます。app. listen(port)
: 指定したポートでサーバーを起動します。
Node.jsのHTTPモジュールを使用する場合
Express.jsを使わない場合でも、Node.jsの組み込みモジュールであるhttp
を使ってサーバーを立ち上げることができます。この場合も、server.listen()
メソッドのコールバック関数でポートを取得します。
const http = require('http');
const port = 3000;
const server = http.createServer((req, res) => {
// リクエスト処理
});
server.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
環境変数を使用する場合
サーバーのポートを環境変数で設定し、アプリケーション内で取得することもできます。これは、デプロイ時にポートを柔軟に変更したい場合に便利です。
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server listening on port ${ port}`);
});
|| 3000
:process.env.PORT
が未定義または空文字の場合、デフォルト値として3000
を使用します。process.env.PORT
: 環境変数PORT
の値を取得します。
Node.js サーバーのポートを取得する方法:コード解説
コード例1:Express.js を使った場合
const express = require('express');
const app = express();
const port = 3000;
app.listen(port, () => {
console.log(`Server listening on port ${por t}`);
});
解説
const express = require('express');
: Express.js ライブラリをインポートします。const app = express();
: Express アプリケーションを作成します。const port = 3000;
: サーバーが使用するポート番号を定義します。app.listen(port, () => { ... });
: 指定したポートでサーバーを起動します。- コールバック関数: サーバーが起動した後に実行されます。
console.log()
: サーバーがリスンしているポート番号をコンソールに出力します。
ポイント
app.listen()
メソッドのコールバック関数は、サーバーが実際に起動した後に実行されるため、ここでポート番号を取得することで、正しいポート番号が得られます。
コード例2:Node.js の HTTP モジュールを使った場合
const http = require('http');
const port = 3000;
const server = http.createServer((req, res) => {
// リクエスト処理
});
server.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
const http = require('http');
: Node.js の組み込み HTTP モジュールをインポートします。const server = http.createServer((req, res) => { ... });
: HTTP サーバーを作成します。- コールバック関数: HTTP リクエストを受け取った際に実行される関数です。
server.listen(port, () => { ... });
: 指定したポートでサーバーを起動します。
Express.js を使わない場合でも、HTTP モジュールを使って同様の処理を行うことができます。
コード例3:環境変数を使った場合
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server listening on port ${ port}`);
});
const port = process.env.PORT || 3000;
:
- 環境変数を使用することで、デプロイ環境ごとに異なるポート番号を設定することができます。
Node.js でサーバーのポートを取得するには、主に以下の方法があります。
- 環境変数
デプロイ環境ごとにポート番号を柔軟に設定したい場合に便利です。 - Node.js の HTTP モジュールの server.listen() メソッドのコールバック関数
Express.js を使わない場合に利用します。 - Express.js の app.listen() メソッドのコールバック関数
Express.js を使用する場合、最も一般的な方法です。
これらの方法を理解することで、Node.js のサーバー開発において、ポートに関する設定を柔軟に行うことができるようになります。
- ポート番号の衝突
複数のアプリケーションが同じポート番号を使用しようとすると、エラーが発生します。ポート番号の管理には注意が必要です。 - listen(0) について
Node.js では、listen(0)
とすることで、OS が空いているポートを自動的に割り当ててくれます。この場合、実際に使用されているポート番号は、コールバック関数内で取得する必要があります。
server.address() を使う
Node.js の HTTP サーバーオブジェクトには、address()
メソッドが用意されています。このメソッドは、サーバーがバインドされているアドレスとポート番号を含むオブジェクトを返します。
const http = require('http');
const server = http.createServer((req, res) => {
// ...
});
server.listen(0, () => {
const address = server.address();
console.log(`Server listening at http://${address.address}:${address.port}`);
});
address.port
: ポート番号を取得します。address.address
: IP アドレスを取得します。server.address()
: サーバーのアドレスとポート番号を取得します。
cluster モジュールを使う
Node.js の cluster
モジュールを使用すると、複数のプロセスでサーバーを分散させることができます。この場合、各ワーカープロセスが異なるポートでリスンする場合があります。
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} el se {
const server = http.createServer((req, res) => {
// ...
});
server.listen(0, () => {
const address = server.address();
console.log(`Worker ${process.pid} listening at http://${address.address}:${address.port}`);
});
}
- 各ワーカープロセスで
server.address()
を使用してポート番号を取得します。 cluster.fork()
: ワーカープロセスを生成します。cluster.isMaster
: マスタープロセスかどうかを判定します。
カスタムプロトコルを使用する場合
Node.js では、Net 模ジュールを使ってカスタムプロトコルを実装できます。この場合、ポート番号は自分で管理する必要があります。
const net = require('net');
const server = net.createServer((socket) => {
// ...
});
const port = 12345;
server.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
リバースプロキシを使用する場合
Nginx や Apache などのリバースプロキシを使用する場合、Node.js サーバーがリスンするポートは、リバースプロキシの設定によって異なります。この場合、Node.js サーバー内から直接ポート番号を取得することはできません。
Node.js でサーバーのポートを取得する方法には、様々なケースや状況に応じて、いくつかの方法があります。
- リバースプロキシ
リバースプロキシの設定によってポート番号が決定 - カスタムプロトコル
Net モジュールを使用し、自分でポート番号を管理 - クラスタ環境
cluster
モジュールを使用して、各ワーカープロセスのポート番号を取得 - 詳細な情報
server.address()
を使用して、アドレスとポート番号を取得 - シンプルなケース
app.listen()
やserver.listen()
のコールバック関数で取得
選択する方法は、以下の要素によって異なります。
- ネットワーク環境
リバースプロキシを使用しているかなど - サーバーの構成
単一プロセスか、クラスタ環境か - 使用するフレームワーク
Express.js や Koa など
注意点
- 動的ポート割り当て
listen(0)
を使用すると、OS が空いているポートを自動的に割り当てますが、必ずしも安定した動作が保証されるわけではありません。 - 環境変数
デプロイ環境によってポート番号が異なる場合は、環境変数を利用すると便利です。
javascript node.js express