錯誤現象:Root 啟動 Tomcat,報 java.net.BindException: Permission denied:80,但 netstat -lnp|grep 80 顯示無佔用。
Linux 系統保留 1024 以下埠為特權埠,僅 Root 進程可綁定。雖用 Root 啟動,但 Tomcat 內部可能切換至非特權用戶(如 tomcat 用戶)導致綁定失敗。
server.xml:<Connector port="8080" ... />iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 # 若需 HTTPS iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
service iptables save # 或 iptables-save > /etc/sysconfig/iptables
| 方案 | 優點 | 缺點 |
|---|---|---|
| iptables 轉發(推薦) | 標準、無需修改程式、效能損耗極低 | 需 Root 權限、重啟後需持久化 |
| authbind | 允許非 Root 綁定特權埠 | 需額外安裝配置、Java 支援有限 |
| setcap CAP_NET_BIND_SERVICE | 賦予 Java 二進制特權 | 安全風險、升級失效、不推薦生產 |
| Nginx 反向代理 | 功能豐富、SSL 卸載、靜態分離 | 增加一層、配置較複雜 |
curl -I https://localhost # 應返回 200 OK,Server 標頭顯示 Tomcat 版本