【问题标题】:Certbot Apache error "Name duplicates previous WSGI daemon definition."Certbot Apache 错误“名称与以前的 WSGI 守护程序定义重复。”
【发布时间】:2018-05-27 22:28:41
【问题描述】:

在我的 Ubuntu 16.04 服务器上,我有一个位于 /etc/apache2/sites-enabled/000-default.conf 的 Apache conf 文件,它看起来像这样(缩写):

WSGIApplicationGroup %{GLOBAL}

<VirtualHost *:80>
    ServerName example.com
    WSGIDaemonProcess myprocess user=ubuntu group=ubuntu threads=10 home=/home/ubuntu/myapp
    WSGIProcessGroup myprocess
    ...
</VirtualHost>

它在 HTTP 模式下运行良好,但是当我运行 $ sudo certbot --apache 来设置 HTTPS 时,它失败并出现错误 Syntax error on line 7 of /etc/apache2/sites-enabled/000-default.conf: Name duplicates previous WSGI daemon definition. 第 7 行是以 WSGIDaemonProcess 开头的行。

【问题讨论】:

    标签: apache ubuntu-16.04 mod-wsgi lets-encrypt certbot


    【解决方案1】:

    事实证明,如果我的 Apache conf 文件 000-default.confonly 声明了 &lt;VirtualHost *:80&gt;...&lt;/VirtualHost&gt;,那么 Certbot 会复制它并创建一个名为 000-default-le-ssl.confsecond Apache conf 文件定义&lt;VirtualHost *:443&gt;...&lt;/VirtualHost&gt;

    出现Name duplicates previous WSGI daemon definition 错误是因为两个 Apache conf 文件具有定义WSGIDaemonProcess myprocess... 的同一行。这似乎是known Certbot bug

    我发现的解决方法是相同 Apache conf 文件中定义两个 VirtualHosts(80 和 443)(这样 Certbot 就不会创建第二个文件),并在两个 VirtualHosts 之外定义 WSGIDaemonProcess,如下所示:

    WSGIApplicationGroup %{GLOBAL}
    WSGIDaemonProcess myprocess user=ubuntu group=ubuntu threads=10 home=/home/ubuntu/myapp
    WSGIProcessGroup myprocess
    
    <VirtualHost *:80>
        ServerName example.com
        ...
    </VirtualHost>
    <VirtualHost *:443>
        ServerName example.com
        ...
    </VirtualHost>
    

    【讨论】:

    • certbot 实际上获取了证书,但由于您提到的原因未能配置。我在 httpd-le-ssl.conf 中手动添加了配置并再次运行 certbot(以防万一),它工作正常。
    • 这不起作用。 @lxmmxl56 解决方案是唯一有效的解决方案
    【解决方案2】:

    正如错误所说,您不能对 WSGIDaemonProcess 定义多次使用相同的名称。对于整个 Apache 实例,它们必须是唯一的。

    如果同一 ServerName 有 80 个和 443 个 VirtualHost 实例,则不应在 443 实例中创建单独的 WSGIDaemonProcess。在 80 实例中定义它并从 443 实例中按名称引用。这样,您就可以在同一 ServerName 的 80 到 443 个 VirtualHost 实例之间共享同一个守护进程组。

    WSGIApplicationGroup %{GLOBAL}
    WSGIRestrictEmbedded On
    
    <VirtualHost *:80>
    ServerName example.com
    WSGIDaemonProcess myprocess threads=10 home=/home/ubuntu/myapp
    WSGIProcessGroup myprocess
    ...
    </VirtualHost>
    
    <VirtualHost *:443>
    ServerName example.com
    WSGIProcessGroup myprocess
    ...
    </VirtualHost>
    

    【讨论】:

    • 我的主要问题是如何让 Certbot 尽可能自动运行。为此,可以在&lt;VirtualHost&gt; 之外定义WSGIDaemonProcess 吗?附:让mod_wsgi 的架构师亲自回答我的问题真是太酷了!
    • 是的,您可以将WSGIDaemonProcess 指令放在VirtualHost 之外。
    • 这应该是答案:)
    • 将 WSGIDaemonProcess 放在虚拟主机之外可能会导致问题,如果您在同一台服务器上提供多个网站,因为它与特定网站无关。
    • 既然你必须有WSGIProcessGroup 指令,或者process-group 选项到WSGIScriptAlias 来说明要使用哪个守护进程组,把它放在外面不是问题。换句话说,你必须说无论如何要使用哪个。仅仅因为WSGIDaemonProcess 定义在VirtualHost 中并不意味着它会被自动使用。
    【解决方案3】:

    让 cerbot 为您执行此操作并在不更改配置结构的情况下避免错误的方法是注释掉有问题的行。 certbot 成功后,您需要手动编辑配置文件以取消注释行并确保为新的 HTTPS 配置选择新的守护进程名称。因此,在这种情况下,您应该:

    1. 在以WSGIDaemonProcess 开头的行前加一个#。
    2. 再次运行 cerbot 并要求它尝试为您重新安装现有证书。这次一定会成功的。
    3. 编辑原始配置文件并取消注释 WSGIDaemonProcess 行。
    4. 编辑 certbot 为您创建的新配置文件并取消注释该行(certbot 将为您复制整个原始配置文件,包括任何 cmets)。
    5. 您需要重命名此文件中的守护进程,因为您不能在两个不同的虚拟主机中使用相同的名称;我建议只在名称中添加 s 以确保安全:name -> names
    6. 重新启动 Apache。

    【讨论】:

    • 可能需要 WSGIDaemonProcess,这不是一个好的解决方案!
    • @aditya-shankar 我会说这绝对是必需的...这就是为什么您返回并取消注释第 3 步中的行,然后再次重新启动 apache,使 WSGIDaemonProcess 再次可用。
    • 1.这是一个非常糟糕的解决方案,多个变量不应具有相同的名称,2. 我真的不认为该解决方案会真正起作用
    • @aditya-shankar 抱歉,我的解释似乎不够好,我还假设用户会进行重定向。关于多个变量的名称不同,您是绝对正确的,实际上它们不能具有相同的名称,这正是 certbot 失败的原因。如果您选择重定向,则不再需要原始守护进程并保持注释状态,因此您只有一个具有该名称的变量。我更新了使用或不使用重定向的答案,并且我已经测试了这两种方案以确保它们有效。
    • 这里给出的解决方案都不适合我。这个确实如此,就像手动执行此操作一样不可取。 +1
    猜你喜欢
    • 2017-01-12
    • 2023-02-05
    • 2020-09-14
    • 1970-01-01
    • 2011-11-16
    • 2016-10-14
    • 1970-01-01
    • 2012-01-23
    • 2013-04-16
    相关资源
    最近更新 更多