nginx实现稳定双栈访问需同时配置listen 80;和listen [::]:80;,方括号为ipv6语法硬性要求,缺之报错;必须确保系统启用ipv6协议栈、网络连通且防火墙放行,https同理需成对配置ssl监听。

直接在 server 块里加一行 listen [::]:80; 就能支持 IPv6,但要真正实现稳定双栈访问,得兼顾语法、协议兼容性和实际网络环境。只配 IPv6 不配 IPv4,或者写错方括号格式,都会导致部分用户无法访问。
监听指令必须成对出现
IPv4 和 IPv6 是独立协议栈,Nginx 不会自动复用套接字。不能只写 listen [::]:80;,否则 IPv4 用户完全失联。正确做法是两者并存:
-
listen 80;—— 等价于listen 0.0.0.0:80;,监听所有 IPv4 地址 -
listen [::]:80;—— 方括号不可省略,::表示所有 IPv6 地址 - HTTPS 同理:同时写
listen 443 ssl;和listen [::]:443 ssl;
注意 ipv6only 参数的默认行为
从 Nginx 1.3.12 起,listen [::]:80; 默认启用 ipv6only=on(即 IPv6 socket 不接受 IPv4 连接)。这是安全且明确的设计,无需额外声明。如果你看到老文档里写 ipv6only=off,那是为了兼容早期 Linux 内核的双栈 socket 行为,现在不推荐使用,反而可能引发端口冲突或监听失败。
确保底层网络就绪
配置生效的前提是服务器本身具备可用的 IPv6 地址:
- 运行
ip -6 addr show,确认输出中有inet6 .../64且非fe80::/10(链路本地地址) - 执行
ping6 -c 3 google.com验证 IPv6 外网连通性 - 检查云平台控制台是否已为该实例分配公网 IPv6 或启用 IPv6 SLAAC/DHCPv6
验证监听状态是否生效
改完配置后,别急着 reload,先做两件事:
- 用
nginx -t检查语法,避免因方括号遗漏或分号缺失导致启动失败 - 用
ss -tln | grep :80或netstat -tuln | grep nginx查看监听结果:应同时出现0.0.0.0:80(IPv4)和:::80(IPv6)两行 - 从支持 IPv6 的客户端(如教育网、移动 5G 网络)用
curl -g http://[2408:abcd::1]/直接测 IPv6 地址,排除 DNS 解析干扰











