Apache的httpd与Tomcat 7:端口80与端口8080

我最近在Amazon ec2上安装了Tomcat 7。 我发现默认情况下Tomcat监听端口8080。

互联网上的文档提倡这是因为linux更好地将低端端口保存给超级用户。 (ec2 btw上的解决scheme是创build一个负载平衡器 – 将目标机器上的端口80到8080之间的通信)

比 – 让我吃惊 – 我继续在另一台机器上安装Apache服务器(yum install httpd),并且感到惊讶! – Apache默认监听端口80

我觉得这很尴尬…现在“港口8080”在哪里呢?

任何人都可以请解释概念上的差异?

谢谢

这个差别大部分是历史性的,但是仍然可以通过Linux和大多数Unix实现来实现。 Unix / Linux认为任何端口号<1024是“特权”,并且需要root权限来绑定它们。 任何用户都应该能够绑定到高于1024的端口。如果你的软件包具有一定的复古性,它将以root身份启动,绑定到一个端口,并且可以选择将有效的UID更改为非特权用户。 Apache HTTPD属于这个类别。 稍后创建的软件包(例如Apache Tomcat)通常采用非特权用户的方式处理所有事情,并默认绑定到更高的端口号。

一些防火墙管理员可以,我敢肯定,在某些情况下,有时会详细讨论端口<1024有时会在防火墙配置中得到特殊处理。

我继续解释。 因为@gunglefunk已经有了answare,所以httpd使用端口80,因为它运行的是主守护进程,直到root /特权用户,即允许绑定小于1024的任何端口。所有其他线程或工作者运行非特权用户(主要是apache )。

Tomcat可以使用相同的原理。 Tomcat完全是用Java编写的,所以只有一个用户运行整个JVM。 通常是用户'tomcat'。

当你想在端口80上听Tomcat时,你有两种可能性。

在“root”下运行tomcat(在tomcat.conf或catalina.sh中更改它)。 但是,由于安全原因,不建议这样做。

在标准用户(通常是tomcat)下的任何高于1024的端口上运行tomcat,并使用proxy_ajp协议。 这意味着您还可以在端口80上运行Apache HTTPD服务器,并将流量转发到tomcat端口(默认为8080上的http,8443上的http,8009上的ajp)。 请参阅https://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html和http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html和http://tomcat.apache.org /connectors-doc-archive/jk2/proxy.html

您不需要以超级用户身份运行进程将其绑定到特权端口。

你可以使用setcap赋予它这个权限:

https://wiki.apache.org/httpd/NonRootPortBinding

不过,这并不是必须的。

例如,您可以简单地使用iptables转发到更高的端口。

也有为此目的而创建的工具,如authbind。

另外,如果安全是一个问题,你也可以在chroot监狱里运行这个过程。