port 80作為網站預設的port因此大部份的環境都不會檔80 port。這意味著有一些程式會因為這個便利因此使用80 port。 當在開發Java EE 網站的時候,我們通常會使用Tomcat作為Servlet的Container。最討厭的是,當你啟動Tomcat做測試的時候,出現了
Port 80 required by Tomcat v7.0 Server at localhost is already in use....
在這一篇裡面,我會介紹,當遇到這種問題的時候,有什麼解決辦法。
前言
port 80作為網站預設的port因此大部份的環境都不會檔80 port。這意味著有一些程式會因為這個便利因此使用80 port。 當在開發Java EE 網站的時候,我們通常會使用Tomcat作為Servlet的Container。最討厭的是,當你啟動Tomcat做測試的時候,出現了
Port 80 required by Tomcat v7.0 Server at localhost is already in use....
在這一篇裡面,我會介紹,當遇到這種問題的時候,有什麼解決辦法。
解決流程
基本上當遇到這種問題的時候,說明文字還蠻清楚,那就是某一個process早已經佔用了我們要使用的port,因此我們處理流程就是:
- 找出是哪一個process佔用了我們的port
- 關掉/修改process所使用的port
找出是哪一個process佔用了我們的port
基本流程:
- 找出佔用port的process id
- 透過taskmgr.exe(工作管理員) 找出process id 對應的 process
1 透過netstat找出佔用port的process id
我們可以透過netstat來看那些process佔用了我們要的port,我們可以在cmd裡面輸入:
netstat -ano | findstr 0.0:80
上面的指令就是使用netstat列出我們所有process所listen的port,然後在透過findstr找出所有port號是80的。
以下面截圖為例,我們有一個process id 是 4 號的,目前正listen port 80:

2 透過taskmgr.exe(工作管理員)找出process
首先我們開啟taskmgr.exe:

2-1 「題外話」 顯示PID欄位
假設你的taskmgr.exe沒有顯示pid欄位,那麼在「檢視(View)" -> "選取欄位(Select Columns..)" -> 勾選 "PID (Process Identifier)"


以上面netstat找到的例子來說,我們要找的process id 是4號,不過從上面截圖可以看出process id 並沒有4。這個時候我們會需要選取「顯示來自所有使用者的處理程序」:

找到process id 是4號的程式描述是「NT Kernel & System」。看到這個相信大家還是不知道這個是什麼Orz,沒關係下一部份將會介紹。
關掉/修改process的port
上一段介紹了如何查到哪一個process佔用了我們的port,這一階段介紹幾個比較常見會佔用port 80 的process。
Skype
首先process id 4和skype沒有關係,不過skype作為大部份電腦都會安裝的軟體,因此從skype開始說。
我第一個遇到佔用80 port的就是skype。很難想像skype為什麼會需要用到port 80,不過看了設定的說明,可能是想要利用port 80 在大部份環境下面都不會被擋住的特性,因此預設會透過port 80和443來傳輸資料。
我們可以再「設定」->「連線」把「以80 和 443 port為替代連入連線」勾掉:
process id 4 "NT Kernel & System"
其實process id 4有可能是以下幾種服務導致的:
- IIS
- SQL Server Reporting services
- Web Deployment Agent Service
- World Wide Web Publishing service
IIS
iis作為一個web serverice當然會佔用port 80,因此我們需要看我們os是否開啟了iis服務。
在Windows 7以上的OS都可以選擇是否要開啟iis服務。預設是關閉的。
我們可以開啟「新增刪除程式(Uninstall or change a program)」-> 「開啟關閉Windows 功能(Turn Windows features on and off)」(這邊中文名稱是我自己翻的,因為os是英文所以不確定正確的中文翻譯),然後看iis是否有開啟:

這個時候,我們要不是把iis勾掉,要不然就是把iis相關的service就okay了。
SQL Server Reporting services
在Server環境下面最長看到的一個就是sql server的reporting service佔用了port 80。
我們可以從service.msc(服務管理員)裡面找到這個服務停掉它來釋放port 80,不過如果還想要使用Sql server reporting,我們就需要修改預設使用的port。
在這裡我會介紹如何修改sql reporting service預設使用的port:



Web Deployment Agent Service

這邊有一個需要注意的是,要用service.msc(服務管理員)來找,而不要用taskmgr(工作管理員)來查找,從上圖就可以看出右邊是用taskmgr而左邊使用service.msc, 然後左邊有顯示但是右邊沒有。
總結
上面提到了一些常見佔用port 80的service。通常來說我們可以在服務的設定裡面修改使用的port,或者以直接停用service的方式達到取回我們的port 80。
不過如果真的找不到佔用的service,那麼就只能修改我們的Tomcat 使用 port。