如何在 nginx 中配置虚拟服务器以仅监听 IPv6

如何在 nginx 中配置虚拟服务器以仅监听 IPv6

对于我的网站我实际上需要 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=offipv6only=on

事实上,您的第一个server块应该是ipv6only=on这样的,因为您listen在同一个server块中有单独的指令,一个仅用于 ipv4,一个仅用于 ipv6(该选项就是用于此的)。

答案2

您误解了ipv6Onlylisten 标志,如果将其设置为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

相关内容