我最近在亚马逊ec2上安装了Tomcat 7。我发现Tomcat默认侦听端口8080.
互联网上的文档主张这是因为linux更好地将较低端口保存给超级用户。 (ec2 btw上的解决方案是创建一个负载均衡器 - 将通信从端口80引导到目标机器上的端口8080)
比 - 令我惊讶的是 - 我继续在另一台机器上安装了Apache服务器(yum install httpd),并且惊喜! - Apache默认侦听端口80!
我觉得这很尴尬......现在'端口8080'在哪里提倡?
任何人都可以解释概念上的区别吗?
由于
答案 0 :(得分:6)
此时差异主要是历史性的,但仍然由Linux和我能想到的大多数Unix实现强制执行。 Unix / Linux考虑任何端口号< 1024为“特权”并要求root权限绑定到它们。任何用户都应该能够绑定到高于1024的端口。如果您的软件包具有特定的年份,则它希望以root用户身份启动,绑定到端口,然后可选地将有效UID更改为非特权用户。 Apache HTTPD属于这一类。稍后创建的软件包(即Apache Tomcat)通常会使用非特权用户执行所有操作,并默认绑定到更高端口号。
有些防火墙管理员可以,我确定,详细了解端口<在某些情况下,1024有时会在防火墙配置中得到特殊处理。
答案 1 :(得分:1)
我继续解释。由于@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上的https,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
答案 2 :(得分:0)
您无需以root身份运行进程即可将其绑定到特权端口。
您可以使用setcap为其授予此权限:
https://wiki.apache.org/httpd/NonRootPortBinding
但这并不是必需的。
例如,您可以简单地使用iptables转发到更高端口。
还有为此目的而制作的authbind等工具。
此外,如果担心安全问题,您也可以在chroot监狱中运行该过程。