我有一台Nginx服务器,可提供将近六个不同的网站。它在刚刚获得IPv6本机支持的Linode(达拉斯数据中心)上运行,我正在尝试将我的大多数站点配置为双堆栈操作。我使用第一个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(主要用于测试目的)。我可以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堆栈上,但是除非我能迅速解决此问题,否则我可能还没有准备好。从任何实际角度来看都没什么大不了的-从我的想象力来看,我的网站都没有资格成为“主要组织”-但请帮我保存我的极客信誉!
编辑添加:
感谢@kolbyjack的回答,现在我有了一个功能齐全的双栈Web服务器。为了清楚起见,我正在编辑他给我的解决方案,以便每个人都可以清楚地看到答案是什么。
我的默认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代表在该端口上侦听的端口。)这里的重要部分似乎是,除了默认的vhost listen
指令之外,所有其他参数都完全缺少任何其他参数-即,没有重复ipv6only=on
。
再次感谢@kolbyjack提供的解决方案!
ipv6only=on
。但是,其他所有内容都保持不变,谢谢!