Комментарий пользователя
Здравствуйте! Арендовал сервер, установил Django — хочу, чтобы он был доступен по протоколу HTTPS. Подскажите, как бесплатно сгенерировать сертификат и использовать его в команде runserver? В качестве веб-сервера использую nginx.
Ответ специалиста
Добрый день, Михаил! Если вы хотите запустить сервер для локальной разработки, будет достаточно OpenSSL. Как его установить, коллеги ответили здесь. Но вам, как понимаю, нужно решение для продакшена — то есть сертификаты, которые будут автоматически обновляться.
Используйте Let’s Encrypt сертификаты. Их можно установить и автоматически продлевать через утилиту CertBot. Перед этим убедитесь, что ваш сервер доступен через 80 порт (HTTP) или 443 (HTTPS), а домен перенаправляет на публичный IP-адрес. Как связать домен с IP-адресом, я написал в другом треде.
Дальше надо установить CertBot:
sudo apt update
sudo apt install certbot python3-certbot-nginx
И сгенерировать сертификат в любой директории (только не потеряйте ее):
sudo certbot --nginx -d example.com -d www.example.com
Эта команда создаст два файла: fullchain.pem и privkey.pem. Первый — ваш сертификат для подтверждения подлинности сайта, второй — ключ для шифрования.
Дальше все просто. Если хотите запустить Django-сервер для разработки и тестирования, используйте runserver_plus:
python3 manage.py runserver_plus --cert-file /your/path/to/certificate/fullchain.pem --key-file /your/path/to/certificate/privkey.pem 0.0.0.0:8000
А вот если нужно поднять проект в продакшене, лучше полностью отказаться от запуска Django с SSL напрямую и полагаться на nginx как на единственный точку входа с SSL.
Тогда Django запускается без проксирования:
python3 manage.py runserver 0.0.0.0:8000
А в nginx настроена примерно такая конфигурация:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /your/path/to/certificate/fullchain.pem;
ssl_certificate_key /your/path/to/certificate/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8000; # порт, на котором работает Django
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Не забудьте, что nginx нужно выдать доступ до сертификатов. О том, как это сделать, написано в этом треде. Последним делом — перезагружаете nginx и готово.
sudo systemctl restart nginx