Certbot: 错误:[::]:443的重复侦听选项

创建于 2018-02-07  ·  30评论  ·  资料来源: certbot/certbot

我的操作系统是(包括版本):

Ubuntu 16.04

我安装了Certbot(certbot-auto,OS软件包管理器,pip等):

sudo apt-get install python-certbot-nginx

我运行了此命令,并产生了以下输出:

nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/example.online:29

Certbot的行为与我的预期不同,因为:

应该没有错误

这是我正在配置的域的相关nginx服务器块或Apache虚拟主机:

server {
  listen 80;
  listen [::]:80;

  server_name example.online;

  root /home/example/deploy;
  index index.html;

  location / {
    try_files $uri $uri/ =404;
  }
}

server {
  listen 80;
  listen [::]:80;
  server_name www.example.online;
  return 301 $scheme://example.online$request_uri;
}

nginx bug

最有用的评论

同样的问题。

我运行了命令: certbot --redirect --nginx -d readacted.com -d www.redacted.com

我的原始conf文件如下所示:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }
    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 $scheme://redacted.com$request_uri;
    }

根据/var/log/letsencrypt/letsencrypt.log,我看到certbot试图这样做:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/redacted.com-0001/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/redacted.com-0001/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 $scheme://redacted.com$request_uri;

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/www.redacted.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/www.redacted.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

nginx抱怨在线listen [::]:443 ssl ipv6only=on; # managed by Certbot

实际的错误信息:

nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/redacted.com:23

一个快速的谷歌从2010年开始显示此页面:

http://www.serverphorums.com/read.php?5,203912

这表明由于一些内部实现细节,nginx感到困惑。

我不是nginx专家,但我已经测试过以下方法似乎可以正常工作:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/redacted.com-0001/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/redacted.com-0001/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 http://redacted.com$request_uri;

        listen [::]:443; # manually changed
        ssl on;  #manually changed
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/www.redacted.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/www.redacted.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

我希望有一个更好的解决方案,理想的解决方法是...

所有30条评论

@iamdubx你明白了吗? 我有同样的问题。

同样的问题...它适用于我的默认网站,但不适用于自定义子域

我有同样的问题。

我确实有一个配置来捕获多个域。

server {
  listen 80;
  listen [::]:80;

  root /home/primarydomain/public;
  index index.html index.htm;

  server_name domain1.com *.domain1.com domain2.com *.domain2.com domain3.com *.domain3.com domain4.com *.domain4.com;

  return 302 $scheme://primarydomain.com$request_uri;

  access_log /var/log/nginx/others.access.log;
  error_log /var/log/nginx/others.error.log;

  location / {
    try_files $uri $uri/ /index.html =404;
  }
}

我得到此配置的nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/others:19

操作系统:Ubuntu 16.04。 有什么帮助吗?

同样的问题。

我运行了命令: certbot --redirect --nginx -d readacted.com -d www.redacted.com

我的原始conf文件如下所示:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }
    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 $scheme://redacted.com$request_uri;
    }

根据/var/log/letsencrypt/letsencrypt.log,我看到certbot试图这样做:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/redacted.com-0001/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/redacted.com-0001/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 $scheme://redacted.com$request_uri;

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/www.redacted.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/www.redacted.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

nginx抱怨在线listen [::]:443 ssl ipv6only=on; # managed by Certbot

实际的错误信息:

nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/redacted.com:23

一个快速的谷歌从2010年开始显示此页面:

http://www.serverphorums.com/read.php?5,203912

这表明由于一些内部实现细节,nginx感到困惑。

我不是nginx专家,但我已经测试过以下方法似乎可以正常工作:

    server {
        server_name redacted.com;
        location / {
        root   /home/redacted/www;
        index  index.html;
      }

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/redacted.com-0001/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/redacted.com-0001/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

    server {
        listen 80;
        listen [::]:80;
        server_name www.redacted.com;
        return 301 http://redacted.com$request_uri;

        listen [::]:443; # manually changed
        ssl on;  #manually changed
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/www.redacted.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/www.redacted.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    }

我希望有一个更好的解决方案,理想的解决方法是...

@ohemorange ,您知道我们是否存在跟踪此问题的问题? 这对我来说很熟悉,但是我不记得是否曾经有过研究。

我以前从未见过。 看起来他们已经解决了原始错误,但使用IPv6时除外。 而且由于我们刚刚推出了IPv6支持,所以这就是人们追求这一点的原因。 上面的解决方案将起作用; 我将看看是否有原因尚未在Nginx for IPv6中修复。

实际上,您甚至不必进行ssl on更改-从一个或两个中删除ipv6only=on解决问题。

@joohoi ,我们可能希望通过完全删除ipv6only=on或仅对添加的每个唯一地址行放入一次来解决此问题。 您是否对这里最好的感觉?

这里有同样的问题。 对于我的第一个域名,一切都很好。 第二个域开始遇到这些问题。

看来Certbot由于某种原因无法完全检测到ipv6only指令。 删除该错误将为大多数用户解决此问题。 由于ipv6only的行为和默认值随着时间的推移而发生了变化,这可能会导致某些真正的Nginx版本出现问题。

为这个令人讨厌的补丁表示歉意,但这已为我修复,希望很快会有适当的修复!

--- /usr/lib/python3/dist-packages/certbot_nginx/configurator.py.orig   2018-02-14 18:38:30.380863045 +0000
+++ /usr/lib/python3/dist-packages/certbot_nginx/configurator.py    2018-02-14 18:38:01.501018553 +0000
@@ -507,10 +507,10 @@ class NginxConfigurator(common.Installer
                           '[::]:{0}'.format(self.config.tls_sni_01_port),
                           ' ',
                           'ssl']
-            if not ipv6info[1]:
-                # ipv6only=on is absent in global config
-                ipv6_block.append(' ')
-                ipv6_block.append('ipv6only=on')
+            #if not ipv6info[1]:
+            #    # ipv6only=on is absent in global config
+            #    ipv6_block.append(' ')
+            #    ipv6_block.append('ipv6only=on')

         if vhost.ipv4_enabled():
             ipv4_block = ['\n    ',
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:        16.04
Codename:       xenial
$ nginx -V
nginx version: nginx/1.10.3 (Ubuntu)
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
$ apt show python-certbot-nginx
Package: python-certbot-nginx
Version: 0.21.1-1+ubuntu16.04.1+certbot+1
Priority: optional
Section: oldlibs
Maintainer: Debian Let's Encrypt <[email protected]>
Installed-Size: 9,216 B
Depends: python3-certbot-nginx
Download-Size: 2,470 B
APT-Manual-Installed: yes
APT-Sources: http://ppa.launchpad.net/certbot/certbot/ubuntu xenial/main amd64 Packages
Description: transitional dummy package
 This is a transitional dummy package for the migration of certbot
 from python2 to python3.  It can be safely removed.

同样的问题。 这个会解决吗?

抱歉,没有文字,但现在开始。

为了阐明这个问题:
ipv6only选项用于每个套接字能够处理多个监听语句。 不幸的是,它只能在服务器配置的套接字中使用一次。 因此,在以下情况下,Nginx将无法启动:

server {
    ...
    server_name first.example.org;
    listen [::]:80 ipv6only=on;
    listen 80;
} 
server {
    ...
    server_name second.example.org;
    listen [::]:80 ipv6only=on;
    listen 80;
}

在最新版本的Nginx中,如果ipv6only设置被完全省略,则不存在此问题,因为变量的默认值为ipv6only=on 。 因此,以下是在Nginx版本> 1.3.4中有效且有效的配置:

server {
    ...
    server_name first.example.org;
    listen [::]:80;
    listen 80;
} 
server {
    ...
    server_name second.example.org;
    listen [::]:80;
    listen 80;
}

但是,在1.3.4之前的Nginx版本中,变量ipv6only的默认值为ipv6only=off ,因此旧版本将因以下配置而失败:

server {
    ...
    server_name first.example.org;
    listen [::]:80;
    listen 80;
} 

当前,发行版打包的情况是,较早版本的Nginx附带的唯一发行版是Debian Wheezy(Debian 7),它从默认存储库中发行了Nginx的1.2.1版本。

如果我们从Certbot中完全删除ipv6only检测并进行设置,这将对Debian Wheezy上的所有用户造成破坏。 幸运的是Wheezy的停产日期定为2018年5月,因此我们几乎可以完全从Certbot代码中消除这种额外的复杂性。

Certbot的当前功能是解析完整的Nginx配置,检测server{}块之一中已经存在的ipv6only=on设置,如果有则忽略添加。 但是,如果找不到该值,则Certbot将添加它。 此问题归结为Certbot无法从用户当前配置的某些块中检测到此已存在的变量,因此尝试将其添加到正在配置的server{}块中。

为了确定解决此问题的方法,我们需要一个完整的示例配置,其中Certbot以上述方式失败,如果我们决定修复,则能够改善对已经存在的ipv6only=on变量的检测这样,而不是完全删除此功能。

感谢您的补丁; 对我有用。 FWIW,我在Ubuntu 17上。

我不得不删除所有

listen [::]:80;
listen 80;

使它起作用

https://github.com/chilion-谢谢! 删除:

listen [::]:80;
listen 80;

也为我工作。

一台Ubuntu服务器上有两个域。 第一个没有问题。 然后我得到了上面的错误。 您的解决方案为我工作。 我刚刚将nginx安装在具有所有最新内容的新服务器上。

谢谢。

删除listen [::]:80但留下listen 80;可以在非默认域上安装

我在子域设置中监听[[::]:443,然后它起作用了。 可以吗

我只是碰到这个问题。 任何试图理解不同的listen指令和ipv6only

我强烈推荐该博客文章,直到发现本文为止,我不确定如何处理我在网上找到的所有不同建议。

https://stefanchrist.eu/blog/2015_01_21/Using%20ipv6only%20in%20Nginx.xhtml

博客文章中的这句话对我来说是一个灯泡般的时刻。

该参数不同于例如ssl标志。 标记ssl可以在多个服务器上下文中使用,并且可以根据需要打开和关闭。 每个端口(和地址)只能设置一次ipv6only标志。 只有一个listen指令可以包含该参数,并且该参数对于使用此端口的所有服务器上下文均有效。 如果使用两次,nginx守护程序将无法启动,并将以下错误消息写入其错误日志

仍然存在,清除python后,重新安装抛出此错误。 certbot中某处错误

评论此行可以解决错误,但会带来其他问题

server {
        listen  443 ssl http2;
#        listen [::]:443 ssl http2 ipv6only=on;


如果有多个域

代替
听[::]:443 ssl http2 ipv6only = on;

采用
听例子。 com:443 ssl http2 ipv6only = on;

在所有服务器块中省略listen指令。

当有两个服务器块在同一域上使用相同的端口侦听时,将显示此错误。
在sites-available文件夹中检查所有配置文件中是否存在重复的侦听器。 在我的情况下,certbot在默认文件中为443创建了一个重复的侦听器。

如果您可以提供配置文件以使用最新版本的Certbot来重现此文件,那么我很希望看到它们。

对于将来可能会通过孤独搜索打入这张票的冒险家,他们不知道为什么在其他任何地方都没有ipv6only=on时会发生这种情况。

如果您的配置中有reuseport ,则会收到相同的错误/问题。

我承认,我很困惑。 根据nginx文档listen有很多参数,但是只有ipv6only指定“启动时只能设置一次”。 其余参数中是否仅缺少此行? 是否依赖系统? 我开始认为在上游纠正这种行为可能是最好的选择。 无论如何,只允许一次设置这些选项似乎很愚蠢。

不幸的是,我不是Linux套接字方面的专家,所以我无法形成一个正确的意见,为什么这些选项只能设置一次,但是我确信这是有原因的。

也许这篇文章有帮助: https :

我所知道的是,就像ipv6onlyreuseport也只能在每个特定端口设置一次(因此,只有一个侦听器可以拥有它)。 为什么这与ipv6only偶然冲突(由于缺少更好的词),我不知道。

不过,我仍然想在运行certbot时添加ipv6only=on有点徒劳。

2012年发布的nginx 1.3.4以来,不再需要它,并且从技术上讲它是EOL。

至少,也许应该进行版本检查,并且仅在添加nginx < 1.3.4之前添加它。

我们没有在Certbot中设置它。 创建服务器块时,我们从现有的默认服务器块或其他模板服务器块中复制一些指令,包括listen指令及其选项。 即使Nginx位于代理或其他类型的端口转发之后,这也可使Certbot工作。 我们从复制的服务器块中明确删除ipv6only=on ,因为文档表明它只能使用一次。

理想情况下,我们将对无法通过这种方式重复的所有选项执行相同的操作,但保留用户可能特别希望其所有服务器块都具有的其他选项。 为此,我们必须知道哪些选项是可重复的,哪些文档似乎没有指出,哪些似乎只有通过遇到类似问题的人员来发现。

谢谢@joohoi
您的解释和解决方案在nginx版本为1.18.0的Ubuntu 20上对我有用

我有2个VPS:1是Ubuntu运行Nginx 1.10正常,另一个是Centos运行Nginx 1.16并出现此错误。 奇怪的

此页面是否有帮助?
0 / 5 - 0 等级