NodeJS 和 Apache 在端口 80 上使用不同的 IP 地址 - 即使 Apache 已配置为使用不同 IP 的端口 80,它也需要清除端口 80

NodeJS 和 Apache 在端口 80 上使用不同的 IP 地址 - 即使 Apache 已配置为使用不同 IP 的端口 80,它也需要清除端口 80

我在端口 80 上使用 node.js 应用程序127.0.0.2:80

server.listen(80, '127.0.0.2', function() {...

我想在端口 80 上使用 Apache其他127.0.0.3:80比如说,我的 httpd.conf 中有这个IP 地址

Listen 127.0.0.3:80
ServerName 127.0.0.3:80

但它给了我错误

Apache 端口(80)已被另一个应用程序使用!

为什么 Apache 关心随机端口 80,而不管它本身被编程为监听哪个 IP 的端口 80?就它而言,端口 80127.0.0.3:80仍然是空闲的。

我甚至已经尝试使用其他 IP 系列(192.xxx、122.xxx)进行此操作,但 Apache 想要释放端口 80,句号。

奇怪的是,如果我先启动 Apache,它启动起来没有问题,然后我甚至可以使用上述相同的配置启动 node.js,它们都可以正常工作。但出于某种原因,珍贵的 Apache 不喜欢任何人在其殿下有机会先启动之前监听任何 IP 地址的端口 80。

我是不是误解了,如果某个应用程序正在侦听,127.0.0.2:80那么只有该 IP 的端口 80 应该处于繁忙状态,其他 IP 的端口 80 应该仍然处于空闲状态127.0.0.3:80?或者是 Apache 行为不当?

答案1

请注意,我在这个答案的最后有一个建议的基本解决方案。

HTTP 默认使用 TCP,虽然 UDP 支持多个程序绑定到单个端口,但 TCP 通常不支持。因此,在这种情况下,端口 80 对于给定的 IP 似乎不是空闲的,因为本地计算机上很可能一次只有一个程序使用该 IP 的端口 80 (TCP)。

关于单独的环回 IP,请记住全部的 127.x.x.xnetblock 是为本地环回保留的。因此指的是与(或或等)127.0.0.1相同的计算机 (即 localhost) 。由于您使用的是环回地址而不是“真实”IP(即标识单独的真实或虚拟 NIC 的 IP),因此当您启动第二个应用程序时,具有给定 IP 的端口 80 可能已被另一个应用程序使用。127.0.0.2127.0.0.3127.127.127.127127.x.x.x

是的,虽然你可以让 Apache 使用本地环回 IP 进行虚拟托管(即127.0.0.1可以127.0.0.2返回不同的页面),但 Apache过程默认情况下仍全局绑定到端口 80 (TCP)。

奇怪的是,如果我先启动 Apache,它启动起来没有问题,然后我甚至可以使用上面相同的配置启动 node.js,它们都运行良好。

我不确定这里指的“工作正常”是什么意思,但在启动 Apache 后,尝试在端口 80 上启动 Node.js http 服务器(npm 安装 http 服务器 -g127.0.0.4),即使指定了这样的地址也会出现错误。

node.js http 服务器启动失败的图片

在我的配置文件中,我必须确保 Apache 专门监听127.0.0.1:80并且 http-server 监听127.0.0.4:80。如果我刚刚Listen 80启动了 Apache,http-server 就会失败。Apache 拒绝启动是完全正常的,无论是对于 Apache 本身还是对于每个进程只有一个 TCP IP/端口组合的原则而言都是如此。

解决方案

解决此问题的简单方法是在同一台机器上运行多个 NIC(每个 NIC 都有自己唯一的 IP)。这样,每个 NIC 都可以有自己的端口 80 绑定(IP+端口 = 完整的目标地址)。另一种可能性是尝试为 NIC 使用“虚拟接口”(这样您就可以为同一个 NIC 提供两个“虚拟”IP)。


参考

Stack Overflow - 两个应用程序可以监听同一个端口吗?

相关内容