Certbot Apache错误"名称重复以前的WSGI守护程序定义."

Jos*_*osh 17 apache mod-wsgi lets-encrypt ubuntu-16.04 certbot

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

WSGIApplicationGroup %{GLOBAL}

<VirtualHost *:80>
    ServerName example.com
    WSGIDaemonProcess myprocess user=ubuntu group=ubuntu threads=10 home=/home/ubuntu/myapp
    WSGIProcessGroup myprocess
    ...
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

它在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.

Jos*_*osh 24

事实证明,如果我的Apache conf文件000-default.conf 声明<VirtualHost *:80>...</VirtualHost>,那么Certbot会复制它并创建一个名为define 的第二个 Apache conf文件.000-default-le-ssl.conf<VirtualHost *:443>...</VirtualHost>

Name duplicates previous WSGI daemon definition出现错误,因为这两个 Apache的conf文件具有相同的线定义WSGIDaemonProcess myprocess....这似乎是一个已知的Certbot错误.

我找到的解决方法是同一个 Apache conf文件中定义VirtualHosts(80和443)(以便Certbot不创建第二个文件),并WSGIDaemonProcess在两个VirtualHosts之外定义,如下所示:

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>
Run Code Online (Sandbox Code Playgroud)

  • certbot实际上获取证书,但由于您提到的原因而导致配置失败。我在httpd-le-ssl.conf中手动添加了配置,然后再次运行certbot(以防万一),并且工作正常。 (2认同)

lxm*_*l56 8

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

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

  • @aditya-shankar 我想说这绝对是必需的...这就是为什么您返回并取消注释步骤 3 中的行,然后再次重新启动 apache,使 WSGIDaemonProcess 再次可用。 (2认同)
  • 这里给出的解决方案都不适合我。这个确实如此,尽管手动执行此操作是不可取的。+1 (2认同)

Gra*_*ton 7

如错误所示,您不能WSGIDaemonProcess多次使用相同的名称作为定义.它们必须对整个Apache实例都是唯一的.

如果你同时拥有80个443实例VirtualHost用于相同ServerName,你不应该创建一个单独WSGIDaemonProcess的443实例.在80实例中定义它,并从443实例中按名称引用.这样,你分享80个443实例之间的相同的守护进程组VirtualHost为同一ServerName.

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>
Run Code Online (Sandbox Code Playgroud)

  • 是的,您可以将 ``WSGIDaemonProcess`` 指令放在 ``VirtualHost`` 之外。 (3认同)
  • 我的主要问题是如何让 Certbot 尽可能自动运行。为此,是否可以在 `&lt;VirtualHost&gt;` 之外定义 `WSGIDaemonProcess`?PS 让`mod_wsgi` 的架构师亲自回答我的问题真是太酷了! (2认同)