我目前正在配置一个能够处理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;
答案 0 :(得分:0)
我创建的解决方案是创建两个不同的nginx配置文件。
(1)IPv6兼容IPv4和
(2)仅限IPv4
然后我用一个首先使用IPv6和IPv4配置运行Nginx的shell脚本覆盖Nginx映像的默认Entrypoint,然后如果运行失败,那么它将使用仅IPv4配置文件启动Nginx。这样,主机是否启用了IPv6并不重要,因为它可以优雅地降级为仅IPv4配置。