Certbot Apache 错误 "Name duplicates previous WSGI daemon definition."

Certbot Apache error "Name duplicates previous WSGI daemon definition."

在我的 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行是[=15开头的行=].

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

如果对于同一个 ServerName,您同时拥有 VirtualHost 的 80 和 443 个实例,则不应在 443 实例中创建单独的 WSGIDaemonProcess。在 80 实例中定义它并从 443 实例中按名称引用。这样你就可以在 ServerName.

的 80 到 443 个实例之间共享同一个守护进程组
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>

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

出现 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>

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

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