我有一个nginx服务器,提供近六个不同的网站。 它运行在刚刚获得了IPv6本机支持(达拉斯数据中心)的Linode上,我正在尝试configuration大部分站点以实现双栈操作。 我得到了第一个使用仅IPv6的子域,如下所示:
server { listen [::]:80 ipv6only=on; listen 80; server_name example.com ipv6.example.com; root /var/www/example.com/htdocs; #More stuff, including PHP, WordPress }
这很有用 – example.com仅用于IPv4(现在),ipv6.example.com仅用于IPv6(主要用于testing目的)。 我可以ping6 ipv6.example.com
,甚至wget ipv6.example.com
没有打破汗水 – 这是wget ipv6.example.com
愉快的痛苦(find了“窍门”之后,nginx绑定虚拟主机,需要ipv6only=on
参数和双listen
指令)。
不过,我现在试图扩展这个支持我的其他领域,从static.example.com开始; 当我采用与上面相同的方法时,虽然(双重listen
指令,包括ipv6only=on
参数),重新启动nginx时出现以下错误:
* Starting Nginx Server... nginx: [emerg] a duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com.conf:3
似乎nginx的IPv6绑定方法不允许基于名称的虚拟主机? 我必须从我的主机获得额外的IPv6地址(没有问题),并使用IPv6上的基于IP的虚拟主机与基于命名的虚拟主机over IPv4? 还是我错过了一个解决scheme,将允许我的configuration在这两个堆栈上保持一致?
我希望我的网站能够在IPv6 世界大会上及时完成IPv6协议栈的工作,但是除非我能够快速清除这个问题,否则我可能还没准备好。 从实际的angular度来看,这并不是什么大不了的事 – 我的任何一个网站都没有一个想象中的“主要组织”的资格,但是帮助我挽救了我的极客!
编辑添加:
感谢@kolbyjack的回答,我现在有了一个function齐全的双栈web服务器。 为了清楚起见,我正在编辑他给我的解决scheme,所以每个人都可以清楚地看到答案是什么。
我的默认catchall虚拟主机有以下listen
指令:
listen 80 default_server; listen 8080 default_server; listen [::]:80 default_server ipv6only=on; listen [::]:8080 default_server ipv6only=on;
我不知道这个命令是否重要,但是它在那里。 然后,每个额外的虚拟主机有以下listen
指令:
listen 80; listen [::]:80;
(或者8080代表在那个端口上监听的端口)。这里的重要部分似乎是除缺省虚拟主机的listen
指令外,完全没有任何额外的参数 – 即不重复ipv6only=on
。
再次,非常感谢@kolbyjack这里的解决scheme!
您只需要在一个套接字的声明中监听选项。 通常你会把它们放在声明中,也包括default_server标志,但是对于一些选项,我认为你可以在任何一个listen指令中设置它们。 只要从除了一个以外的所有监听中删除ipv6only = on。