如何让Node.js应用同时在IPv4和IPv6的80端口运行?
解决Express应用同一端口同时支持IPv4和IPv6访问的问题
当你将Express应用绑定到::(IPv6通配地址)时,部分操作系统默认会以IPv6-only模式运行套接字,导致它无法处理IPv4请求,进而让不支持IPv6的设备无法访问应用。以下是两种可行的解决方式:
方案1:代码层面同时监听IPv4和IPv6地址
你可以在同一个Express实例上创建两个监听:一个绑定IPv4的0.0.0.0,另一个绑定IPv6的::。由于IPv4和IPv6属于不同的地址族,同一端口可以被这两个监听同时占用,不会产生冲突。
修改后的代码示例:
const express = require('express') const app = express() const port = 80 const host6 = "::"; const host4 = "0.0.0.0"; app.get('/', (req, res) => { res.send('Hello World!') }) // 监听IPv6地址 app.listen(port, host6, () => { console.log(`IPv6 server listening at http://[${host6}]:${port}`) }) // 监听IPv4地址 app.listen(port, host4, () => { console.log(`IPv4 server listening at http://${host4}:${port}`) })
方案2:系统级开启IPv6套接字兼容IPv4
如果不想修改代码,可以通过调整系统配置,让绑定::的套接字同时接收IPv4请求:
- Linux/macOS:执行以下命令临时生效,如需永久生效可写入
/etc/sysctl.conf文件sysctl -w net.ipv6.bindv6only=0 - Windows:修改注册表项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters,将DisabledComponents的值设置为0(需重启系统生效)
这种方式下,你只需保持原来绑定::的代码即可,系统会自动将IPv4请求映射到IPv6套接字上。
内容的提问来源于stack exchange,提问作者Suisse
相关产品推荐
相关产品推荐

