从 Puppet nginx 模块中删除“ipv6only”选项

从 Puppet nginx 模块中删除“ipv6only”选项

我的 nginx 服务器(服务多个虚拟主机)无法启动:

Nov 08 23:54:43 foo systemd[1]: Starting nginx - high performance web server...
Nov 08 23:54:43 foo nginx[3830]: nginx: [emerg] duplicate listen options for [::]:8081 in /etc/nginx/sites-enabled/000-mysite.vhost:3
Nov 08 23:54:43 foo nginx[3830]: nginx: configuration file /etc/nginx/nginx.conf test failed
Nov 08 23:54:43 foo systemd[1]: nginx.service: control process exited, code=exited status=1
Nov 08 23:54:43 foo systemd[1]: Failed to start nginx - high performance web server.
Nov 08 23:54:43 foo systemd[1]: Unit nginx.service entered failed state.
Nov 08 23:54:43 foo systemd[1]: nginx.service failed.

我已将问题定位到绑定listen到 IPv4 和 IPv6 的同一 TCP 端口的两个指令,其中ipv6only使用了该选项:

[root@foo ~]# head /etc/nginx/sites-enabled/mysite.vhost 
server {
        listen 8081;
        listen [::]:8081 ipv6only=on;  
        ssl off;
...

所以这个配置可以正常工作:

[root@foo ~]# head /etc/nginx/sites-enabled/mysite.vhost 
server {
        listen 8081;
        listen [::]:8081;  
        ssl off;
...

[相关问题:https://serverfault.com/questions/638367/do-you-need-separate-ipv4-and-ipv6-listen-directives-in-nginx]

现在,这个配置是由 Puppet 通过puppet-nginx 模块。有没有办法(通过 Puppet)不指定选项ipv6only,或以其他方式解决问题?

答案1

我无法说出你的木偶部分是什么样子。不管怎样,puppet-nginx 模块有资源nginx::resource::vhost,我猜你会以某种方式使用它。该资源有选项ipv6_listen_options,其中默认情况下包括 ipv6only=on。所以你应该可以这样调用它:

nginx::resource::vhost { 'example.com':
    ipv6_listen_options => '',
    # another options there
}

另一种可能性是您使用旧模块,该模块已ipv6only=on硬编码在模板中。已于二月修复这个拉取请求。因此您可以将其从模板或升级模块中删除。

相关内容