3秒でわかる
1 台のサーバーで動く複数のサービスを見分けるための番号。IP アドレスが建物なら、ポート番号は入り口の部屋番号にあたる役割を持ちます。
もう少し詳しく
どういうものか
ポート番号は、届いた通信をどのプログラムに渡すかを決める 0 から 65535 までの整数です。IP アドレスだけでは「どの機器か」までしか分からず、その機器で Web サーバーとデータベースが同時に動いていると、どちらへ渡すべきか判断できません。宛先ポート番号がその仕分け先を示します。
番号は用途によって 3 つの帯に分かれています。0 から 1023 はウェルノウンポートと呼ばれ、HTTP の 80、HTTPS の 443、SSH の 22 などが割り当て済みです。1024 から 49151 は登録済みポートで、MySQL の 3306 や PostgreSQL の 5432 がここに入ります。それ以降は一時的な接続元として自動で使われます。
なぜ必要か
ポート番号があるおかげで、1 台のサーバーに Web サイトと API とデータベースを同居させられます。逆にこの仕組みが無ければ、サービスの数だけ機器か IP アドレスが要ります。開発時に手元で複数のアプリを同時に立ち上げられるのも、3000 番と 8080 番のように番号をずらせるからです。
具体例
# 何番でどのプロセスが待ち受けているかを見る
ss -tulnp | grep LISTEN
# tcp LISTEN 0 511 0.0.0.0:80 users:(("nginx",pid=812))
# tcp LISTEN 0 151 127.0.0.1:3306 users:(("mysqld",pid=944))
# 指定した番号へ届くかを確かめる
<a href="/glossary/curl" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">curl</a> -I http://localhost:8080
nc -zv db.example.com 3306待ち受けアドレスが 0.0.0.0 なら外部からも受け付ける状態、127.0.0.1 なら同じ機器の中からしか繋がらない状態です。データベースは後者にしておくのが基本です。
つまずきやすいところ
Address already in use は、直前に起動したプロセスがまだその番号を掴んでいるときに出ます。ターミナルを閉じてもバックグラウンドで生き残っていることがあるので、上のコマンドで待ち受けているプロセスを特定して終了させます。
1023 番以下で待ち受けるには管理者権限が必要です。この制限を知らずに 80 番で起動しようとして権限エラーに遭い、原因を探し回るケースが多くあります。開発中は 3000 番や 8000 番を使い、公開時にリバースプロキシで 80 番と 443 番に受けさせる形が定番です。
似た用語との違い
IP アドレスは機器を指し、ポート番号はその機器の中のサービスを指します。ドメイン名は IP アドレスに付けた覚えやすい別名なので、階層が 1 つ上です。
覚え方
住所が IP アドレス、部屋番号がポート番号、表札がドメイン名です。