Certbot Apache出现错误:“名称重复先前的WSGI守护程序定义。”

37

在我的Ubuntu 16.04服务器上,我有一个Apache配置文件,位于/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>

在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开头的那一行。

3个回答

52

原来的Apache配置文件000-default.conf只有声明<VirtualHost *:80>...</VirtualHost>,会导致Certbot复制该文件并创建一个新的名为000-default-le-ssl.conf的Apache配置文件,用于定义<VirtualHost *:443>...</VirtualHost>

出现Name duplicates previous WSGI daemon definition错误是因为两个Apache配置文件都有相同的行定义WSGIDaemonProcess myprocess...。这似乎是一个已知的Certbot bug

我找到的解决方法是在同一个Apache配置文件中定义两个虚拟主机(80和443)(这样Certbot就不会创建第二个文件),并将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>

2
Certbot实际上获取了证书,但由于您提到的原因在配置方面失败了。我手动在httpd-le-ssl.conf中添加了配置,然后再次运行了Certbot(以防万一),这次它成功了。 - iceman
这个不起作用。@lxmmxl56的解决方案是唯一可行的。 - Bogdan

19

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

如果您对于相同的ServerName有80和443实例的VirtualHost,则不应在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>

2
我的主要问题是如何使Certbot尽可能自动运行。为此,是否可以在<VirtualHost>之外定义WSGIDaemonProcess?顺便说一句,能够让我得到由mod_wsgi的架构师本人回答我的问题真是太酷了! - Josh
3
可以将“WSGIDaemonProcess”指令放在“VirtualHost”之外。 - Graham Dumpleton
1
this should be the answer :) - vee
将 WSGIDaemonProcess 放在虚拟主机之外可能会导致问题,特别是当您在同一服务器上提供多个网站时,因为它不会与特定的网站相关联。 - user984003
1
由于必须使用 WSGIProcessGroup 指令或 process-group 选项来指定要使用的守护进程进程组,因此在外部定义该选项并不是问题。换句话说,你仍然需要指定要使用哪个进程组。仅仅因为在 VirtualHost 中定义了 WSGIDaemonProcess 并不意味着它会自动被使用。 - Graham Dumpleton

16
让cerbot为您执行此操作并避免出现错误而不更改配置结构的方法是注释掉有问题的行。在证书成功后,您需要手动编辑配置文件以取消注释行,并确保为新的HTTPS配置选择新的守护进程名称。因此,在这种情况下,您应该:
  1. 在以WSGIDaemonProcess开头的行前面加上#。
  2. 再次运行cerbot,并要求其尝试为您重新安装现有证书。这一次会成功。
  3. 编辑原始配置文件并取消注释WSGIDaemonProcess行。
  4. 编辑certbot为您创建的新配置文件,并取消注释该行(certbot将为您复制整个原始配置文件,包括任何注释)。
  5. 您需要在此文件中重命名守护程序进程,因为您不能在两个不同的虚拟主机中使用相同的名称;我建议只向名称添加一个s以表示安全:name -> names
  6. 重新启动Apache。

3
我认为这是绝对必要的...这就是为什么你需要重新进入第3步,并取消注释该行,然后再次重启apache,以使WSGIDaemonProcess再次可用。 - lxmmxl56
1
@aditya-shankar 抱歉,看来我的解释不够清楚,我还假设用户会进行重定向。你说得很对,多个变量不能有相同的名称,事实上它们不能有相同的名称,这正是 certbot 失败的原因。如果您选择重定向,则原始守护进程过程将不再必要,并保持注释状态,因此您只有一个具有该名称的变量。我更新了答案,使其可以在有或没有重定向的情况下工作,并且我已经测试了两种情况以确保它们可以正常工作。 - lxmmxl56
2
这里提供的解决方案都对我无效。尽管手动操作并不理想,但这个解决方案却有效。+1 - some-non-descript-user
1
对我有用。我取消了第一个文件中的注释行,重新启动了Apache,它就像魔法一样工作了:)你得到了我的投票。 - snoob dogg
1
这个问题让我感到非常沮丧,虽然我不确定它是否是最佳解决方案或者是否会引起未来的问题,但这是唯一有效的解决方案。我在这里记录下了步骤,以防需要回溯,目前为止一切顺利。感谢@lxmmxl56! - johnwonderbread
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接