如何用Tomcat redirect port 80 to 8080

最近剛好學校作業要求用Tomcat來部屬網站,需要把從port80得到的請求導向Tomcat預設的服務端口port8080,好讓使用者在網頁請求時不會看到醜醜的:8080

沒用過Tomcat也不會寫Java(?,但想想它終究是個HTTP web server,應該有個地方可以設定一下吧。果然在tomcat/conf/ 路徑下,有個叫做server.xml 的檔案,裡面可以找到有個<Service>開頭的區塊,其中的port只要改成80就好。

於是我改了,但還是跑不動阿。查了Tomcat的Logs(catalina.out),會發現當我把server.xml中的port改成80,會遇到Caused by: java.net.BindException: Permission denied ,原因是1024以內的port都是system port,原則上除了root user是不能使用這些port的[1]。所以得去systemctl給tomcat的.service檔案中修改服務運行的使用者,可以看到原本預設的是tomcat不是root,把這邊改成User=root就可以順跑port80了。因為我這次是手動安裝、自己解壓縮Tomcat的,所以系統不會自己創建 tomcat.service 文件,我還需要自己額外創建檔案。

雖然最終目的達成了,但其實用root跑服務並不是安全的作法,想想以前會用Nginx做reverse proxy, 或是用Linux原生的iptables[2]來做port forwarding, 其實都是更好的選擇,只是這次想嘗試看看Tomcat能不能做到,就沒有額外再改了。

[1]: https://stackoverflow.com/questions/53030886/tomcat-change-port-from-8080-to-80-not-working

[2]: https://www.youtube.com/watch?v=uuWzk8U4dJE&t=291s