为什么Tomcat可以使用8080端口但不能使用80端口?

22

我已经启动并测试了Tomcat,端口为8080(默认)。现在我将连接器端口改为80并重新启动Tomcat,在我的极简Debian 6.0安装上什么都不会显示。现在问题出在哪里呢?

<Connector port="80" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           URIEncoding="UTF-8"
           redirectPort="8443" />

3
你在catalina.out里面是否遇到了BindException?很有可能系统中的其他东西已经绑定了80端口。 - Marko Topolnik
可能另一个服务已经在该端口上运行了。 - juergen d
1
首先要做的事情是:查看日志(在tomcat/logs目录中)。 - Denys Séguret
我想查看日志,但在 /etc/tomcat6 中找不到,最可能的日志文件夹在哪里? - Dominik
@Jack Murphy:*(不是答案,因此是评论)* 就我个人而言,我从来不以root或sudo的身份运行Tomcat。实际上,在Linux上,我甚至不会以root身份安装Java:我使用仅限于该用户权限的用户帐户安装Java。然后,我在端口8080/8443上运行Tomcat。但是,系统已配置(作为root),以透明方式将端口80重定向到8080等(使用iptables)。 - TacticalCoder
可能是重复问题:https://dev59.com/e2cs5IYBdhLWcg3w8oXK - amos
7个回答

31

前往 /etc/default/tomcat6 并将 #AUTHBIND=no 改为 AUTHBIND=yes

 # If you run Tomcat on port numbers that are all higher than 1023, then you
 # do not need authbind.  It is used for binding Tomcat to lower port numbers.
 # NOTE: authbind works only with IPv4.  Do not enable it when using IPv6.
 # (yes/no, default: no)
 #AUTHBIND=no

请参见http://thelowedown.wordpress.com/2010/08/17/tomcat-6-binding-to-a-privileged-port-on-debianubuntu/。 - Dominik

11

您在以root用户身份启动Tomcat时使用了80端口吗?在Linux系统中,只有root用户可以绑定端口号小于或等于1024的端口。


6
值得注意的是:通常情况下,以“root”身份启动Tomcat在安全方面是不明智的,除非它能够(并已配置)在绑定后切换其用户为非特权用户(上次我检查时还不可能实现)。 - Romain
我使用root帐户登录,使用/etc/init.d/tomcat6 start启动了Tomcat。我能否修改它以便在端口80下启动? - Dominik
1
Tomcat的配置文件决定了使用哪个端口,启动进程的方式并不重要。很有可能是其他程序正在监听80端口。尝试运行命令:netstat -an | grep 80,这将让你知道是否已经有程序在80端口上监听。 - rooftop
@Romain,你认为使Tomcat在80端口上可访问的最佳方法是什么?安装Apache httpd服务器和Tomcat,然后使用Apache httpd服务器通过mod_proxy代理到Tomcat? - Arya
@arya 我建议使用Tomcat加上一些反向代理(Apache,Nginx或者适合你用例的其他工具)。 - Romain

11

两种典型原因:

  • 你很可能没有权限监听低于1024的端口(通常需要管理员特权,比如成为root用户)。
  • 其他程序可能已经在80端口上监听了(例如apache)。

1
@Romain:好的,root或类似特权账户。我已经编辑过了以澄清。我相信1024应该没问题(也就是说只有0-1023需要特权,但我可能错了)。 - Jon Skeet
没有其他东西在端口80上监听。我是root,但我正在使用/ etc/init.d/tomcat6 start执行它。 - Dominik

11
如果之前的注释都不起作用(就像我遇到的情况),您可以将端口 80 的流量重定向到 8080
操作步骤如下:
在终端中输入以下三个命令,具体请参考此链接
$ sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
$ sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 

这只是一个极端情况,正如你所提到的“如果之前评论的所有内容都没有起作用”。 - emecas
其他读者看到了我所错过的东西:
  • 这很简单,实现了目标,而无需安装和管理authbind
  • Tomcat侦听低端口。
  • Tomcat以非特权用户身份运行。
为什么这是一个极端情况的解决方案?
- rich p
这个解决方案并不是很好,因为最终用户会在他们的URL中看到端口号并且看到URL的改变。 - alexk
@alexk,我使用这个解决方案没有URL更改问题 - 我知道这是一个非常古老的帖子。 - Gonza

2

在更改绑定后以root身份运行您的启动脚本。

sudo ./<path to tomcat bin director>/startup.sh

完美的解决方案,救了我的一天。 - Mohan Seth
*nix 的答案是正确的,但 Windows 呢? - Koray Tugay

0

停止Apache服务,然后运行Tomcat,你就可以了。默认情况下,Apache在80端口上运行。


端口号小于等于1024是特权端口,这个怎么处理? - Romain
2
OP没有提到这个问题。你不应该做出任何假设。 - Romain
我非常确定端口80上没有运行任何程序,因为这是一个基本的Debian系统,只安装了SSH。我使用apt-get添加了Java和Tomcat。 - Dominik
端口80上没有运行任何Apache或其他服务。 - Dominik

0

您可以使用authbind/privbind或者capabilities来绑定到80端口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接