我在端口 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,而不管它本身被编程为监听哪个 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.x
netblock 是为本地环回保留的。因此指的是与(或或等)127.0.0.1
相同的计算机 (即 localhost) 。由于您使用的是环回地址而不是“真实”IP(即标识单独的真实或虚拟 NIC 的 IP),因此当您启动第二个应用程序时,具有给定 IP 的端口 80 可能已被另一个应用程序使用。127.0.0.2
127.0.0.3
127.127.127.127
127.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
),即使指定了这样的地址也会出现错误。
在我的配置文件中,我必须确保 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)。
参考