对于我的网站我实际上需要 3 个域名:
- example.domain:可通过 IPv4 和 IPv6 访问
- ipv4.example.domain:可通过 IPv4 访问仅有的
- ipv6.example.domain:可通过 IPv6 访问仅有的
我尝试使用以下 nginx 配置来解决这个问题:
server {
listen [::]:80 ipv6only=off default_server;
listen 80 default_server;
server_name example.domain;
}
# IPv4 only endpoint
server {
listen 80;
server_name ipv4.example.domain;
}
# IPv6 only endpoint
server {
listen [::]:80 ipv6only=on;
server_name ipv6.example.domain;
}
但这会引发错误:nginx: [emerg] duplicate listen options for [::]:80
对于 IPv6 服务器块(我的示例中为第 15 行)。
我如何才能达到预期的效果?我是否需要使用 2 个单独的 IPv6 地址来托管这些网站?
答案1
从文档listen
关于ipv6only
选项:
此参数默认开启。启动时只能设置一次。
不能同时使用ipv6only=off
和ipv6only=on
。
事实上,您的第一个server
块应该是ipv6only=on
这样的,因为您listen
在同一个server
块中有单独的指令,一个仅用于 ipv4,一个仅用于 ipv6(该选项就是用于此的)。
答案2
您误解了ipv6Only
listen 标志,如果将其设置为off
,则会获得双栈套接字,而如果将其设置为 ,on
则会生成 IPv6 套接字
您需要以下配置:
server {
# listen on IPv6 only
listen [::]:80 ipv6only=on default_server;
# listen on IPv4 only
listen 80 default_server;
server_name example.domain;
}
# IPv4 only endpoint
server {
# listen on IPv4 only
listen 80;
server_name ipv4.example.domain;
}
# IPv6 only endpoint
server {
# listen on IPv6 only
listen [::]:80;
server_name ipv6.example.domain;
}
如果有请求通过服务器套接字传入[::]:80
,NGINX 就知道它必须与服务器匹配ipv6.example.domain
,或者,如果不匹配,则example.domain
返回到。example.domain