必须同时配置listen 80;和listen [::]:80;才能实现双栈访问,ipv6监听需用方括号包裹[::],https同理需添加listen [::]:443 ssl;,并确保系统、防火墙及云平台均启用ipv6支持。

要让 Nginx 的一个 server 块同时响应 IPv4 和 IPv6 请求,关键不是“选一个”,而是“两个都写”,且写法有严格区别。
必须分开写两条 listen 指令
IPv4 和 IPv6 的监听不能合并,也不能用通配符替代。正确做法是:在同一个 server 块里并列写两行:
-
listen 80;→ 监听所有 IPv4 地址(等价于0.0.0.0:80) -
listen [::]:80;→ 监听所有 IPv6 地址([::]是 IPv6 的“任意地址”,方括号不可省)
写成 listen ::80; 或 listen *:80; 都会报错。Nginx 不识别无括号的 IPv6 地址,也不支持 * 通配协议类型。
HTTPS 场景同样适用双 listen
启用 SSL 时,443 端口也要照此处理:
listen 443 ssl;listen [::]:443 ssl;
注意:两个 listen 都要带上 ssl 参数,否则 IPv6 连接会因缺少 SSL 上下文而失败。证书和密钥配置只需一份,共用即可。
ipv6only=on 参数建议保留
虽然现代 Nginx(1.3+)默认开启 ipv6only,但显式加上更稳妥,尤其在旧系统或定制编译版本中:
listen [::]:80 ipv6only=on;listen [::]:443 ssl ipv6only=on;
这个参数确保 IPv6 socket 不会意外接收 IPv4 映射地址(如 ::ffff:192.0.2.1),避免端口复用冲突,也符合双栈清晰分离的设计意图。
验证与常见问题
配置完成后务必执行三步:
- 运行
nginx -t检查语法 —— 若提示 “invalid port” 或 “invalid IPv6 address”,大概率是漏了方括号 - 重载服务:
nginx -s reload或systemctl reload nginx - 用
ss -tln | grep ':80\|:443'查看监听项,确认出现*:80(IPv4)和:::80(IPv6)两行
如果只看到 IPv4 监听,检查系统是否启用 IPv6(sysctl net.ipv6.conf.all.disable_ipv6 应为 0)、防火墙是否放行 IPv6 流量、云平台安全组是否开通 IPv6 入方向规则。











