主机未启用 IPv6 时 Nginx 未启动

Nginx not starting when IPv6 is not enabled in host machine

我目前正在配置一个能够处理 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;

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

(1) IPv6 和 IPv4 兼容并且

(2) 仅限 IPv4

然后我用 shell 脚本覆盖 Nginx 图像的默认入口点,该脚本首先 运行 使用 IPv6 和 IPv4 配置的 Nginx,然后如果 运行 失败,那么它会使用仅 IPv4 配置文件启动 Nginx。这样主机是否启用 IPv6 并不重要,因为它会优雅地降级到仅 IPv4 配置。