在主机

时间:2018-01-23 10:01:20

标签: docker nginx ipv6 ipv4

我目前正在配置一个能够处理IPv6地址的软件,我还配置了Nginx docker镜像,以便它可以处理IPv4和IPv6地址。我遇到的问题是我不确定将要部署软件的主机是否启用了IPv6。

问题在于,无论何时在主机中未启用IPv6,都会导致以下错误。

nginx: [emerg] socket() [::]:8080 failed (97: Address family not supported by protocol)
2018/01/23 10:53:08 [emerg] 1#1: socket() [::]:8080 failed (97: Address family not supported by protocol)

我想要实现的是,即使主机未启用IPv6,nginx也会忽略所有IPv6,只需转到IPv4即可。我发现的一个解决方案是使用nginx docker存储库中讨论的环境变量(envsubsts),并使用docker-compose文件设置端口和地址。但是,此解决方案需要手动更改docker-compose文件,具体取决于是否启用了IPv6。

任何帮助或建议都可以。谢谢!

以下是我的nginx配置中处理IPv6和IPv4的部分。

server {

    listen [::]:8080 ssl ipv6only=off;
    server_name localhost;

    ssl on;
    ssl_certificate    /etc/nginx/cert.pem;
    ssl_certificate_key    /etc/nginx/key.pem;

    ...
    ...

    }
}

我也尝试过分离IPv4和IPv6,但它仍然会导致问题。

listen 8080 ssl;
listen [::]:8080 ssl ipv6only=on;

1 个答案:

答案 0 :(得分:0)

我创建的解决方案是创建两个不同的nginx配置文件。

(1)IPv6兼容IPv4和

(2)仅限IPv4

然后我用一个首先使用IPv6和IPv4配置运行Nginx的shell脚本覆盖Nginx映像的默认Entrypoint,然后如果运行失败,那么它将使用仅IPv4配置文件启动Nginx。这样,主机是否启用了IPv6并不重要,因为它可以优雅地降级为仅IPv4配置。