nginx配置ipv6虚拟主机需在listen指令中用方括号包裹ipv6地址,如listen [::]:80;ipv4与ipv6需分别监听,推荐写法为同时配置listen 80和listen [::]:80;还需确保系统启用ipv6、nginx编译支持ipv6及防火墙放行ipv6端口。

Nginx 中配置 IPv6 的 Virtual Host,核心在于 listen 指令正确声明 IPv6 地址,同时确保系统和 Nginx 本身支持 IPv6。它不是额外加个开关,而是通过显式监听 IPv6 套接字来实现。
关键点是:IPv4 和 IPv6 是独立的协议栈,需分别或协同监听;Nginx 默认不自动监听 IPv6,必须手动配置。
listen 指令中正确写法 IPv6 地址
IPv6 地址必须用方括号 [] 包裹,否则解析失败:
- ✅ 正确:
listen [::]:80;(监听所有 IPv6 地址的 80 端口) - ✅ 正确:
listen [2001:db8::1]:443 ssl;(监听特定 IPv6 地址的 HTTPS) - ❌ 错误:
listen :::80;或listen 2001:db8::1:80;(语法非法)
同时支持 IPv4 和 IPv6(双栈推荐写法)
一个 server 块可叠加多个 listen,让同一虚拟主机响应两类请求:
server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
⚠️ 注意:[::]:80 默认启用 ipv6only=on(只处理 IPv6),若想让一个 IPv6 套接字同时接受 IPv4 映射连接(即 IPv4-mapped IPv6),需显式加参数:
listen [::]:80 ipv6only=off;
但更常见、更清晰的做法是分开写:listen 80; + listen [::]:80;,语义明确且兼容性更好。
确保底层支持 IPv6
- 操作系统需启用 IPv6(检查
/proc/sys/net/ipv6/conf/all/disable_ipv6是否为0) - Nginx 编译时需含 IPv6 支持(运行
nginx -V 2>&1 | grep -o with-http_v2_module不能说明 IPv6,应查configure arguments中是否有--with-ipv6;现代主流发行版包通常默认开启) - 防火墙(如
iptables/ip6tables或ufw)要放行 IPv6 的对应端口(例如ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT)
绑定到具体 IPv6 地址(可选,用于多 IP 主机)
如果服务器有多个公网 IPv6 地址,可精确绑定:
listen [2001:db8:abcd::1]:80; listen [2001:db8:abcd::1]:443 ssl http2;
配合 server_name 即可实现基于 IP 的 IPv6 虚拟主机,与 IPv4 逻辑一致。
不复杂但容易忽略











