Для поддержки автоматического продления сертификата LetsEncrypt certbot использует --апаче обработчик.
например
certbot renew --apache
Этот обработчик устанавливает временный VirtualHost для * /. хорошо известный / acme-challenge / на сервере Apache, чтобы подтвердить обновление.
Проблема в том, что этот механизм не работает, если существующий виртуальный сервер использует HTTPS и Django через WSGI, установленный в корне http-сервера.
Временному VirtualHost не удается захватить URL-адрес, поэтому Django пытается обслужить запрос (и терпит неудачу), поскольку URL-адрес отсутствует в списке URL-адресов.
Написание вопроса заставило меня задуматься о том, как это работает, поэтому я разработал ответ. Поскольку я не мог найти ответа на то, что должно быть распространенной проблемой, я решил опубликовать то, что нашел.
Есть и другие решения, например. certbot-django и django-letsencrypt но и то, и другое - дело более хлопотное, чем просто позволить стандартному certbot справиться с этим.
В --апаче обработчик certbot помещает свои файлы в / var / lib / letsencrypt / http_challenges, поэтому все, что требуется, - это заставить Apache обрабатывать эти файлы так же, как это рекомендуется в документации для статических файлов.
<VirtualHost *:443>
[....SSL stuff]
AliasMatch /.well-known/acme-challenge/(.*)$ /var/lib/letsencrypt/http_challenges/$1
<directory /var/lib/letsencrypt/http_challenges>
AllowOverride None
Require all granted
</directory>
[....WSGI stuff]
WSGIScriptAlias / /opt/myserver/myapp/wsgi.py
</VirtualHost>