我有一个nginx服务器服务近六个不同的网站。它运行在一个刚获得IPv6本地支持(达拉斯数据中心)的Linode上,我正在尝试配置我的大部分站点来进行双堆栈操作。我获得了第一个使用IPv6 6专用子域运行的子域,如下所示:
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是IPv6 4专用的(目前),而ipv6.example.com是IPv6 6专用的(主要是为了测试目的)。我可以ping6 ipv6.example.com,甚至是wget ipv6.example.com,而不费吹灰之力--这是令人愉快的无痛苦的(在找到了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的虚拟主机,并在IPv4上使用基于名称的虚拟主机?还是我遗漏了一种解决方案,允许我的配置在两个堆栈上保持一致?
我希望我的站点能够及时地在IPv6堆栈上运行,以供世界IPv6 6日使用,但除非我能迅速清除这些内容,否则我可能还没有准备好。从任何实际的角度来看,这都不是什么大不了的事情--我的网站中没有一个能被任何想象中的“主要组织”所称道--但是帮我拯救我的怪胎吧!
由于@kolbyjack的回答,我现在有了一个功能齐全的双堆栈web服务器。为了清楚起见,我正在编辑他给我的解决方案,这样每个人都能清楚地看到答案是什么。
我的默认徽标所有vhost都有以下listen指令:
listen 80 default_server;
listen 8080 default_server;
listen [::]:80 default_server ipv6only=on;
listen [::]:8080 default_server ipv6only=on;我不知道命令是否重要,但就在这里。然后,每个附加的vhost都有以下listen指令:
listen 80;
listen [::]:80;(相反,8080用于监听该端口。)这里的重要部分似乎是除了默认的vhost的listen指令之外,完全没有任何附加的参数--即不重复ipv6only=on。
再次感谢@kolbyjack的解决方案!
发布于 2011-06-07 02:12:31
您只需要对套接字的一个声明进行侦听选项。通常,您会将它们放在也包含default_server标志的声明中,但是对于某些选项,我认为您可以在任何一个监听指令上设置它们。只需从除一个之外的所有侦听器中删除ipv6only=on即可。
https://serverfault.com/questions/277653
复制相似问题