Ошибка Certbot Apache "Имя дублирует предыдущее определение демона WSGI".

На моем сервере Ubuntu 16.04 у меня есть /etc/apache2/sites-enabled/000-default.conf 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.

Ответ 1

Оказывается, если мой файл apache conf 000-default.conf объявляет только <VirtualHost *:80>...</VirtualHost>, тогда Certbot дублирует его и создает второй файл conf apache, называемый 000-default-le-ssl.conf определить <VirtualHost *:443>...</VirtualHost>.

Name duplicates previous WSGI daemon definition ошибку Name duplicates previous WSGI daemon definition потому что оба файла WSGIDaemonProcess myprocess... Apache имеют одну и ту же строку, определяющую WSGIDaemonProcess myprocess... Это похоже на известную ошибку Certbot.

Обходной путь, который я нашел, состоит в том, чтобы определить как VirtualHosts (80, так и 443) в одном и том же файле конфига Apache (так что 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>

Ответ 2

Как говорится в ошибке, вы не можете использовать одно и то же имя для определения 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>

Ответ 3

Чтобы заставить cerbot сделать это за вас и избежать ошибки, не меняя структуру конфигурации, просто закомментируйте ошибочную строку. Итак, в этом случае вы должны:

  1. Поставьте # перед строкой 7.
  2. Запустите cerbot еще раз и попросите его попытаться переустановить существующий сертификат для вас. Это удастся на этот раз.
  3. Отредактируйте новый файл конфигурации, созданный для вас certbot, и раскомментируйте строку (certbot скопирует для вас весь исходный файл конфигурации, включая любые комментарии).
  4. Перезапустите Apache.