8080
連接埠 8080 · HTTP alternate
80 被占走時,開發伺服器、Tomcat 或代理伺服器會改抓的那個連接埠;也是你需要它的時候,早就有人占著的那一個。
查出是誰占用連接埠 8080
照你的系統挑一行貼上去執行。它會直接印出占著這個連接埠的行程,以及它綁在哪個位址上——通常看到這兩件事答案就出來了。
- macOS
lsof -nP -iTCP:8080 -sTCP:LISTEN會印出占著這個連接埠的指令名稱、PID、使用者,以及它綁在哪個位址上。`127.0.0.1:8080` 代表只綁回送位址,這正是同一個 Wi-Fi 下的手機連不到的原因;`*:8080` 則是每一張介面。沒有輸出就代表這個連接埠真的是空的。監聽者屬於別的使用者時記得加 `sudo`。如果指令欄出現 `Docker` 或 `com.docker.backend`,那是容器發布出來的連接埠,要停的是容器,不是去砍那個行程。
- Linux
sudo ss -tlnp 'sport = :8080'`-t` 挑 TCP,`-l` 只看監聽中的,`-n` 讓連接埠維持數字,`-p` 用 `users:(("java",pid=8123,fd=50))` 的形式補上所屬行程。本機位址那一欄要看仔細:`[::]:8080` 是 IPv6 萬用位址,通常連 IPv4 也一起收;但如果旁邊還單獨列了一行 `0.0.0.0:8080`,代表 IPv4 那一側被第二個行程拿走了。不加 `sudo` 的話,不屬於你的那些行程欄會是空的。
- Windows
netstat -ano | findstr :8080最後一欄是持有這個 socket 的 PID,用 `tasklist /FI "PID eq 8123"` 換成名字。`findstr` 比的是子字串,所以遠端位址裡的 `:8080` 也會被撈進來——動手之前先確認本機位址那一欄。如果什麼都沒列出來、綁定卻還是失敗,問題就在下面那個保留範圍。
- Windows
netsh interface ipv4 show excludedportrange protocol=tcp當 8080 上沒有任何監聽、綁定卻還是失敗時,跑這一行。Hyper-V、WSL2、Docker Desktop 和 Windows 的 NAT 服務會在開機時預留幾段動態連接埠,只要其中一段剛好蓋到 8080,每一次綁定都會失敗,而且找不到任何行程可以怪。如果 8080 落在列出來的範圍裡,要嘛重啟那個占走它的主機服務,要嘛把自己的伺服器換到所有範圍以外的號碼。
從機器外面確認一次
`nmap -Pn -p 8080 example.com` 回答的是「從這台機器外面看,那裡有沒有東西連得到」。`open` 代表 TCP 交握完成;`closed` 代表主機回了 reset,也就是機器活著但沒人在聽;`filtered` 代表探測封包消失了,被防火牆丟掉。加 `--reason` 可以看出實際是哪一種,加 `-sV` 會讓 nmap 取回應並回報伺服器 banner——你常常就是這樣才發現 8080 上是一個早就忘掉的 Tomcat。只掃你自己負責的主機。
連不上 8080 的時候怎麼讀
| 你看到的訊息 | 代表什麼 |
|---|---|
Error: listen EADDRINUSE: address already in use :::8080(8080 已經被占用) | 已經有別的行程占著這個連接埠了。`:::8080` 這種寫法是 IPv6 萬用位址,在多數系統上連 IPv4 也一起蓋掉,所以綁在那裡的服務會把兩邊都擋住。用你系統對應的那行指令找出持有者;十次有九次是同一個伺服器上一輪的執行,只是被丟到背景而沒有真的停掉。 |
Only one usage of each socket address (protocol/network address/port) is normally permitted(每個 socket 位址通常只允許一個程式使用) | 同一件事的 Windows 說法,錯誤碼 10048。如果 `netstat` 根本沒列出任何監聽,那就不是被占用而是被保留:先用上面那行 `netsh` 查保留範圍,不要去追一個不存在的行程。 |
伺服器說已經啟動了,但同一個網路上的另一台裝置連線時被拒絕 | 它綁到了 `127.0.0.1` 而不是 `0.0.0.0`。現在很多框架是刻意改成預設綁回送位址的,所以這是一個設定參數而不是 bug——`--host 0.0.0.0`、`HOST=0.0.0.0` 或對應的寫法。用上面的指令確認一下:位址那一欄會告訴你它選了哪一個。 |
伺服器結束後大約一分鐘,連接埠就自己釋放了 | 連線還開著就被關掉的 socket 會停在 `TIME_WAIT` 最多兩分鐘,在那之前新的綁定會被拒絕,除非程式有設 `SO_REUSEADDR`。等它過去可以,換一個連接埠啟動也可以。沒有東西需要被砍。 |
8080 有回應,但回應的是你沒有啟動的東西 | 通常是某個容器還在發布這個連接埠——`docker ps` 會把 `0.0.0.0:8080->8080/tcp` 那一行秀出來。也可能是開機就啟動的服務,例如 Tomcat 或印表機的管理介面。對自己的機器跑 `nmap -sV`,它會讀 banner 並告訴你那是什麼。 |
連接埠 8080 上跑的是什麼
IANA 把 8080 登記為 `http-alt`(HTTP Alternate),TCP 和 UDP 都有,所以號碼本身是有指派的,只是上面實際跑什麼比較算慣例。它會變成這麼多軟體的預設值,理由其實很平凡:Unix 系統上 1024 以下是特權連接埠,要綁 80 得有 root 或被授予的能力,而 8080 兩者都不需要。於是它就成了所有開發者手動啟動的東西的落腳處——Tomcat 的預設 connector、Jenkins、Spring Boot、Vite 或 webpack 的代理、Docker 發布出來的 Web 容器連接埠,以及在 443 終結 TLS 的反向代理背後那個來源站。這個號碼代表的就只是純文字 HTTP,沒有別的:它不加密、對瀏覽器沒有任何特殊意義,`http://host:8080/` 只是一個送到不常見號碼上的普通 HTTP 請求。也因為用它的軟體太多,被占用的 8080 十之八九是你自己的另一個行程,而不是什麼神祕的東西——下面的指令一行就能把它點名出來。
連接埠 8080 該不該對外開
把服務從 80 搬到 8080 對安全完全沒有幫助。掃全網的機器掃 8080 跟掃 80 一樣勤,被發現所需的時間是一樣的。8080 在實務上比較危險,是因為住在上面的東西通常是本來就不該對外的:Tomcat 的 manager 應用、還停在初始設定精靈的 Jenkins、Spring Boot 的 actuator 端點、容器的除錯介面。開發伺服器請綁 `127.0.0.1`,讓它出不了這台機器;真的要對外的東西,走 443 上終結 TLS 的反向代理,而不是在防火牆上把 8080 打開。如果非開不可,就限制來源位址並在前面擺一道認證;而且要當它是純文字在傳,因為它本來就是。
- 服務
- HTTP alternate
- 傳輸協定
- TCP
- 登記狀態
- IANA 有指派
- 分類
- Web 與 HTTP
站上可以搭配的工具
這些全都在你的瀏覽器裡跑,不會上傳任何東西。
相關連接埠
查 8080 的時候,通常也會順手看一下這幾個。