nats server runのデフォルトポートって4222じゃないの?
結論
-
違います
- デフォルトポートが4222なのは
nats server runではなくnats-serverです
- デフォルトポートが4222なのは
はじめに
仕事でNATSを使う必要があったので、挙動のイメージを掴むためにチュートリアル動画やデモ用のCLIツールを触っていました。
NATSとは
NATSは以下のような特徴を持つメッセージング基盤である。
- 軽量なPub/Sub+Req/Rep
- 多様なメッセージングモデルが使える
- Proto, JSON, BSON, 文字列など
- 高いスケーラビリティ
上位システムであるJetStreamと組み合わせるとメッセージの永続化・配信保証などが可能となる。

NATSイメージ図
Pub/Sub, Req/RepはNATS serverを介して行われる。
サブスクライバーは購読したい件名(subject)をサーバに伝えて待機し、パブリッシャーは任意のsubject(事前にNATSサーバに登録するような処理は不要)でデータをNATSサーバに向けて送信する。
NATSサーバがメッセージングを仲介するため、サブスクライバー/パブリッシャーは配信先を気にする必要がない。
初心者向けには以下の動画が公開されており、ここでnats cliを導入教材として紹介していたので私も試すことにしました。
nats cliを使ってみる
上記のチュートリアルに従って動作確認をしていきます。
nats context add localhost --description "Localhost"実行後、改めてnats ctx select localhostを実行すると以下のような設定が見られます。
PS C:\Users\issan> nats ctx select
[localhost] ? Select a Context localhost
NATS Configuration Context "localhost"
Description: Localhost
Server URLs: nats://127.0.0.1:4222
Path: C:\Users\issan\.config\nats\context\localhost.json
JSON形式での設定ファイルは以下の通りです。
localhost.json
{
"description": "Localhost",
"url": "nats://127.0.0.1:4222",
"socks_proxy": "",
"token": "",
"user": "",
"password": "",
"creds": "",
"nkey": "",
"cert": "",
"key": "",
"ca": "",
"nsc": "",
"jetstream_domain": "",
"jetstream_api_prefix": "",
"jetstream_event_prefix": "",
"inbox_prefix": "",
"user_jwt": "",
"color_scheme": "",
"tls_first": false,
"windows_cert_store": "",
"windows_cert_match_by": "subject",
"windows_cert_match": "",
"windows_ca_certs_match": null
}
困ったこと
ここで私は「nats ctx select localhostを実行しておき、nats server runを実行すればlocalhost:4222でサーバが待機してくれるようになる」と理解し、チュートリアルを進めました。
しかしnats bench pub testを実行してみると、出力は以下のようになります。
PS C:\Users\issan> nats bench pub test --msgs 10000000 --clients 2 --no-progress
01:56:51 Starting Core NATS publisher benchmark [clients=2, msg-size=128 B, msgs=10,000,000, multi-subject=false, multi-subject-max=100,000, sleep=0s, subject=test]
nats: error: dial tcp 127.0.0.1:4222: connectex: No connection could be made because the target machine actively refused it.
PS C:\Users\issan>
nats ctx select localhost > nats server runを再度実行しましたが、出力は以下のようになります。
PS C:\Users\issan> nats server run
Starting local development NATS Server instance: nats_development
...
Extending Remote NATS: false
URL: nats://0.0.0.0:65491
Clean on Exit: false
...
[21056] [INF] Listening for client connections on 0.0.0.0:65491
[21056] [INF] Server is ready
サーバインスタンスはnats_developmentを使っているし、リッスンしているのも0.0.0.0:65491となっていてlocalhostコンテキストで上がっていなさそうです。
localhost:4222で誰も待っていないので、nats bench pub testは当然失敗します。
調査
実際にnats server runコマンドに相当する部分のコードを確認してみました。
nats server run(nats cliに付属のNATSサーバを立てる機能)としてはコンテキストで何が選ばれていてもnats_developmentの設定に従ってサーバを立ち上げる・nats_developmentがない場合は適当な空きポートを選んでnats_developmentコンテキストそのものを作るような仕様となっているようです。
参考にしていたREADMEの「Benchmarking and Latency Testing」はその直前章のチュートリアルから連続して実施できるものではないため、ここで少し環境に手を加える必要があります。
解決方法
1. nats_developmentコンテキストを使用する
パブリッシャー/サブスクライバー側で、nats context select localhostではなくnats ctx select nats_developmentを実行します。
PS C:\Users\issan> nats ctx select nats_development
NATS Configuration Context "nats_development"
Description: Local user access for NATS Development instance
Server URLs: nats://127.0.0.1:51123
Username: local
Password: ********************************
Path: C:\Users\issan\.config\nats\context\nats_development.json
PS C:\Users\issan> nats bench pub test --msgs 10000000 --clients 2 --no-progress
02:42:01 Starting Core NATS publisher benchmark [clients=2, msg-size=128 B, msgs=10,000,000, multi-subject=false, multi-subject-max=100,000, sleep=0s, subject=test]
02:42:01 [1] Starting Core NATS publisher, publishing 5,000,000 messages
02:42:01 [2] Starting Core NATS publisher, publishing 5,000,000 messages
NATS Core NATS publisher aggregated stats: 6,622,077 msgs/sec ~ 808 MiB/sec
[1] 3,619,502 msgs/sec ~ 442 MiB/sec ~ 0.28us (5,000,000 msgs)
[2] 3,311,038 msgs/sec ~ 404 MiB/sec ~ 0.30us (5,000,000 msgs)
message rates min 3,311,038 | avg 3,465,270 | max 3,619,502 | stddev 154,232 msgs
avg latencies min 0.28us | avg 0.29us | max 0.30us | stddev 0.01us
これで、サーバが待っているポートに向けて操作を実行できます。
2. nats-serverをインストールする
そもそもnats cliに付属しているサーバ機能は簡単な試験や動作確認用のものであり、ベンチマークテストのチュートリアルで想定されているのはnats-serverなようです。
Windows環境であればscoopを用いてワンラインでインストールできます。
PS C:\Users\issan> scoop install nats-server
Installing 'nats-server' (2.12.1) [64bit] from 'main' bucket
nats-server-v2.12.1-windows-amd64.zip (6.4 MB) [============================================] 100%
Checking hash of nats-server-v2.12.1-windows-amd64.zip ... ok.
Extracting nats-server-v2.12.1-windows-amd64.zip ... done.
Linking ~\scoop\apps\nats-server\current => ~\scoop\apps\nats-server\2.12.1
Creating shim for 'nats-server'.
'nats-server' (2.12.1) was installed successfully!
インストール後、nats-server実行で0.0.0.0:4222でリッスンしているのが確認できます。
PS C:\Users\issan> nats-server
[10900] 2025/10/23 00:49:14.339723 [INF] Starting nats-server
[10900] 2025/10/23 00:49:14.352289 [INF] Version: 2.12.1
[10900] 2025/10/23 00:49:14.352289 [INF] Git: [fab5f99]
[10900] 2025/10/23 00:49:14.352289 [INF] Name: NAKY3QGU5KC62LD7YJ7T4L3DM3K4YGGZ5ZR7NDYPNIKBRZJWFYQYL35R
[10900] 2025/10/23 00:49:14.352289 [INF] ID: NAKY3QGU5KC62LD7YJ7T4L3DM3K4YGGZ5ZR7NDYPNIKBRZJWFYQYL35R
[10900] 2025/10/23 00:49:14.353865 [INF] Listening for client connections on 0.0.0.0:4222
[10900] 2025/10/23 00:49:14.365759 [INF] Server is ready
参考
Discussion