对于我的网站,我实际上需要 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 地址来托管这些网站?
从有关该选项的文档
listen
中ipv6only
:您不能同时使用
ipv6only=off
和ipv6only=on
。事实上,无论如何,你的第一个
server
块应该是ipv6only=on
,因为你listen
在同一个server
块中有单独的指令,一个仅用于 ipv4,一个仅用于 ipv6(这是该选项的用途)。你误解了
ipv6Only
listen 标志,如果它被设置为off
,你会得到一个双栈套接字,而如果它被设置为on
它会产生一个 IPv6 套接字您需要以下配置:
如果请求进入
[::]:80
服务器套接字,NGINX 知道它必须与服务器ipv6.example.domain
or匹配,如果没有匹配则example.domain
回退。example.domain