2.

Unity のポート番号競合エラー対処

編集
この記事の要点
  • ポート番号の競合は別プロセスが同じポートを LISTENしているときに発生
  • Linux/Mac: lsof -i :8080 / ss -tnlp | grep 8080
  • Windows: netstat -ano | findstr :8080 + tasklist /FI "PID eq xxx"
  • 対処: 競合プロセスを停止 or 別ポートに変更
  • Tomcat なら conf/server.xml / Spring Boot なら server.port

 

エラーの状況

# Tomcat
SEVERE: StandardServer.await: create[localhost:8005]:
java.net.BindException: アドレスは既に使用中です (Bind failed)

# Spring Boot
Web server failed to start. Port 8080 was already in use.

# Node.js / Express
Error: listen EADDRINUSE: address already in use :::3000

# Python
OSError: [Errno 48] Address already in use

競合プロセスの特定

Linux / Mac

# lsof (推奨)
$ sudo lsof -i :8080
COMMAND  PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java     1234   tomcat  46u  IPv6  ...   0t0      TCP  *:http-alt (LISTEN)

# ss (より新しい)
$ sudo ss -tnlp | grep :8080
LISTEN 0  100  *:8080  *:*  users:(("java",pid=1234,fd=46))

# netstat (古い)
$ sudo netstat -tnlp | grep :8080
tcp6   0   0  :::8080   :::*   LISTEN   1234/java

# プロセスの詳細
$ ps -fp 1234
UID   PID  PPID  C STIME TTY  TIME     CMD
tomcat 1234 1  0  May15  ?  00:00:30 /usr/bin/java -jar tomcat...

Windows

# netstat
> netstat -ano | findstr :8080
TCP    0.0.0.0:8080    0.0.0.0:0    LISTENING    1234

# プロセス特定
> tasklist /FI "PID eq 1234"
イメージ名                   PID セッション名         セッション#       メモリ使用量
java.exe                    1234 Services                   0     512,000 K

# PowerShell
PS> Get-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess

競合プロセスの停止

Linux / Mac

# graceful 停止 (推奨)
$ sudo kill 1234

# 強制停止 (応答しない場合)
$ sudo kill -9 1234

# プロセス名で
$ pkill java
$ pkill -f "tomcat"

# 1 行で
$ sudo kill $(lsof -t -i:8080)

Windows

# taskkill
> taskkill /PID 1234 /F

# プロセス名で
> taskkill /IM java.exe /F

# PowerShell
PS> Stop-Process -Id 1234 -Force

別ポートに変更

Tomcat













Spring Boot

# application.properties
server.port=9090

# または環境変数
$ SERVER_PORT=9090 java -jar app.jar

# コマンドライン
$ java -jar app.jar --server.port=9090

# 自動空きポート (ランダム)
server.port=0

Node.js / Express

// 環境変数で
const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on ${port}`));

// 起動
PORT=4000 node server.js

// 自動空きポート
const server = app.listen(0, () => {
    console.log(`Listening on ${server.address().port}`);
});

Python (Flask / FastAPI)

# Flask
if __name__ == "__main__":
    app.run(port=5001)  # デフォルト 5000

# uvicorn (FastAPI)
$ uvicorn main:app --port 8001

# gunicorn
$ gunicorn -b 0.0.0.0:8001 myapp:app

よく使われるポート番号

ポート用途
22SSH
25SMTP (メール送信)
80HTTP
443HTTPS
3306MySQL
5432PostgreSQL
27017MongoDB
6379Redis
8080Tomcat / 開発用 HTTP
8443Tomcat HTTPS
3000Node.js / React 開発サーバ
5173Vite 開発サーバ
9000PHP-FPM / Jenkins
9200Elasticsearch
5000Flask
8000Django

1024 番未満のポート

1-1023 番はwell-known portsで、root 権限が必要:

# 一般ユーザで 80 ポート起動を試みる
$ java -jar app.jar --server.port=80
java.net.SocketException: Permission denied

# 対処 1: sudo で起動 (非推奨、セキュリティリスク)
$ sudo java -jar app.jar --server.port=80

# 対処 2: setcap で権限付与 (Linux)
$ sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/java

# 対処 3: 別ポート + iptables / nginx でリバースプロキシ
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
# または nginx で 80 → 8080 へ転送 (推奨)

Docker 環境での競合

# Docker コンテナ間のポート衝突
$ docker run -p 8080:8080 myapp1
$ docker run -p 8080:8080 myapp2
# → docker: Error response from daemon: ports are not available

# 対処: ホスト側ポートを別に
$ docker run -p 8081:8080 myapp2  # ホスト 8081 → コンテナ 8080

# docker-compose
services:
  app1:
    ports:
      - "8080:8080"
  app2:
    ports:
      - "8081:8080"

# 使用中ポート確認
$ docker ps

TIME_WAIT 状態

サーバ再起動直後にポートが「TIME_WAIT」で使えないことがある:

# TIME_WAIT のソケット確認
$ netstat -an | grep :8080
tcp  0  0  :::8080  :::*  TIME_WAIT

# Linux カーネル設定で再利用許可
$ sudo sysctl -w net.ipv4.tcp_tw_reuse=1

# アプリ側で SO_REUSEADDR を有効化
# Java の場合
ServerSocket server = new ServerSocket();
server.setReuseAddress(true);
server.bind(new InetSocketAddress(8080));

# Spring Boot は内部で設定済み (通常気にしなくて良い)

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール方法
  2. ポート番号の競合
  3. ドキュメントルート(htdocs)の変更方法