nginx双栈配置核心是ipv4用listen 80,ipv6必须写listen [::]:80且方括号不可省;两者并存即可同时服务双协议,现代版本无需ipv6only=on但加上更稳妥,https同理。

核心就一条:IPv4 监听用 listen 80 这类简洁写法即可,IPv6 必须显式写成 listen [::]:80,方括号不能省,否则配置会报错。
IPv6 地址必须用方括号包裹
IPv6 地址含冒号(如 ::、2001:db8::1),而冒号在 URL 和配置中也用于分隔端口,所以 Nginx 要求所有 IPv6 地址必须用方括号明确界定。写成 listen ::80 或 listen 2001:db8::1:80 都是非法语法,会触发 nginx -t 检查失败。
-
listen [::]:80→ 正确:监听全部 IPv6 地址的 80 端口 -
listen [2001:db8::1]:80→ 正确:只监听指定 IPv6 地址 -
listen ::80或listen 0.0.0.0:80→ 错误:前者缺括号,后者是 IPv4 写法,不适用于 IPv6
双栈推荐写法:两个 listen 并存
让同一 server 块同时服务 IPv4 和 IPv6 用户,最稳妥、最通用的方式是并列写两行 listen:
-
listen 80;→ 绑定 IPv4 的 0.0.0.0:80 -
listen [::]:80;→ 绑定 IPv6 的 [::]:80
无需额外参数,Nginx 1.3+ 默认已支持双栈共存。老版本或特殊编译环境可加 ipv6only=on 显式声明,但现代部署中通常不强制要求。
ipv6only 参数的实际作用
该参数控制 IPv6 socket 是否“独占”IPv6 流量。默认值为 on(Nginx ≥1.3),意味着 [::]:80 只处理 IPv6 连接;设为 off 时,某些系统下该 socket 可能同时接受 IPv4 映射的 IPv6 连接(即 IPv4-mapped IPv6),但这种行为不可靠且已不推荐。
- 保持
listen [::]:80 ipv6only=on;更清晰、更兼容 - 不要依赖
ipv6only=off来替代 IPv4 监听 —— 它不是双栈的正确实现方式
HTTPS 场景同样适用,端口与语法一致
443 端口的 IPv6 监听逻辑完全一致,只是把端口号换掉:
listen 443 ssl;listen [::]:443 ssl;
SSL 证书本身不区分 IP 协议,同一张证书可同时用于 IPv4 和 IPv6 访问。注意:若使用 SNI(多域名共用 443),确保 DNS 同时提供 A 和 AAAA 记录。











