全局设置 ipv6only=off

全局设置 ipv6only=off

自更新以来,我的 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()

相关内容