4

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

互联网上的文档主张这是因为linux更好地将较低的端口保存给超级用户。(ec2 btw 上的解决方案是创建一个负载均衡器 - 将通信从端口 80 定向到目标机器上的端口 8080)

比 - 令我惊讶的是 - 我继续在另一台机器上安装了 Apache 服务器(yum install httpd),惊喜!- Apache 默认监听 80 端口!

我想这很尴尬......现在“8080端口”的拥护者在哪里?

谁能解释概念上的差异?

谢谢

4

3 回答 3

6

在这一点上,差异主要是历史性的,但仍然由 Linux 和我能想到的大多数 Unix 实现强制执行。Unix/Linux 将任何小于 1024 的端口号视为“特权”并且需要 root 权限才能绑定到它们。任何用户都应该能够绑定到高于 1024 的端口。如果您的软件包是某个年份的,它希望以 root 身份启动,绑定到一个端口,然后它可以选择将有效的 UID 更改为非特权用户。Apache HTTPD 属于这一类。稍后创建的软件包(即 Apache Tomcat)通常采用非特权用户执行所有操作并默认绑定到更高端口号的路线。

我敢肯定,一些防火墙管理员可以详细说明端口 < 1024 在某些情况下如何在防火墙配置中得到特殊处理。

于 2013-06-26T18:56:07.510 回答
1

我继续解释。正如@gunglefunk 已经回答的那样,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 上的 https,8009 上的 ajp)。请参阅https://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.htmlhttp://tomcat.apache.org/connectors-doc/ajp/ajpv13a.htmlhttp://tomcat.apache.org /connectors-doc-archive/jk2/proxy.html

于 2013-06-26T19:20:55.627 回答
0

您无需以 root 身份运行进程即可将其绑定到特权端口。

您可以使用 setcap 给它这个权限:

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

不过,这并不是真正必要的。

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

还有一些工具,例如 authbind 就是为此目的而制作的。

此外,如果安全是一个问题,您还可以在 chroot 监狱中运行该进程。

于 2015-12-07T23:37:11.830 回答