自更新以来,我的 nginx 服务器只能通过 IPv6 访问,而不能通过 IPv4 访问,而我的配置包含
listen [::]:80 default_server;
现在我把它改成了
listen [::]:80 default_server ipv6only=off;
并且服务器再次通过 IPv4 可用。这似乎是由于nginx 1.3.4(“nginx 1.3.4 的变化”部分)。
由于我在同一台机器上有多个服务器配置,我想进行ipv6only=off
全局设置,是否有可能这样做?
答案1
我刚刚完成了从 1.0 到 1.4 的升级。
由于实际上只有一个侦听器绑定到任何给定端口,因此只需ipv6only=off
指定任何人您的listen
指示。
因此,在我的默认server
块中,我有:
listen [::]:80 ipv6only=off default_server;
和
listen [::]:443 ipv6only=off default_server;
所有其他server
块仅指定原始listen
指令。并且它可以工作;任何虚拟主机都可以通过 IPv4 或 IPv6 访问。
您还可以将其添加到全部,但实际上这并不是必需的。将其添加到其中任何一个就足够了。
但是,由于该ipv6only=
标志仅适用于 Linux,因此我不再使用此构造。我当前的指令明确指定了 IPv4 和 IPv6,例如:
listen [::]:80 default_server;
listen 80 default_server;
答案2
@Michael Hampton 答案的另一种选择(但你必须触摸所有文件)是插入
listen 80; # listen for IPv4
listen [::]:80; # listen for IPv6
对于所有服务器。
奇怪的是,插入listen [::]:80 ipv6only=off
多个服务器会导致
nginx: [emerg] duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/default.conf:3
并且混合使用listen 80;
和ipv6only=off
(在不同的服务器中)会导致
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()