К этому моменту мы с вами прошли почти весь путь деплоя Django-проекта cinemahub на виртуальный сервер:
- проект развернут на VPS;
- Django-приложение запущено через Gunicorn;
- Nginx настроен как реверс-прокси;
- корректно работают static и media файлы;
- сайт открывается по обычному HTTP-протоколу.
Однако в современном интернете этого уже недостаточно.
Если сайт открывается по адресу вида:
http://cinemahub.ru
браузер помечает его как небезопасный, а пользователи видят соответствующее предупреждение. Более того:
- браузеры могут блокировать часть функционала;
- поисковые системы (Google, Яндекс) понижают сайт в выдаче;
- авторизация и передача данных происходят без шифрования.
Наша задача — перевести сайт на HTTPS, подключив SSL-сертификат.
SSL-сертификат — это цифровой сертификат, который:
- шифрует данные между браузером пользователя и сервером;
- подтверждает, что домен действительно принадлежит вам;
- позволяет использовать протокол https://.
Большинство SSL-сертификатов являются платными, однако существует бесплатный и полностью легальный вариант — сертификаты от центра сертификации Let’s Encrypt:
Эти сертификаты:
- бесплатны;
- действуют 90 дней;
- автоматически продлеваются;
- используются миллионами сайтов по всему миру.
Чтобы не выпускать и не обновлять сертификаты вручную, используется утилита Certbot:
https://certbot.eff.org/pages/about
Certbot:
- сам получает SSL-сертификат;
- автоматически настраивает Nginx;
- умеет продлевать сертификаты без нашего участия.
Мы будем работать именно с ним.
Подключаемся к серверу по SSH и выполняем команду:
sudo apt install certbot python3-certbot-nginx -yЧто здесь происходит:
certbot— основная утилита;python3-certbot-nginx— модуль, который автоматически интегрируется с Nginx и правит его конфигурацию.
После выполнения команды Certbot будет установлен и готов к работе.
Теперь запускаем процесс выпуска сертификата.
Вместо cinemahub.ru укажите свой домен:
sudo certbot --nginx -d cinemahub.ru-
Certbot попросит указать email Указывайте реальный адрес — на него могут приходить уведомления о проблемах с сертификатом.
-
Подтверждение условий использования Вводим
y. -
Вопрос о перенаправлении HTTP → HTTPS Соглашаемся, выбирая вариант с автоматическим редиректом.
Если все прошло успешно, вы увидите сообщение о том, что сертификат выдан.
Скорее всего это проблема конфигурации Nginx + Django/Gunicorn.
Let’s Encrypt работает так:
- Certbot говорит Nginx:
«Разреши мне временно отдавать файлы из
/.well-known/acme-challenge/» - Let’s Encrypt заходит по HTTP (не HTTPS!) и проверяет файл
- Если файл отдался — домен подтверждён
У тебя шаг 2 падает с 500, значит:
Nginx пытается проксировать запрос в Gunicorn, а Gunicorn либо не отвечает, либо падает, либо Django ломается.
Самая частая причина в Django-проектах, когда DEBUG = False, но ALLOWED_HOSTS настроен неправильно. Certbot делает HTTP-запрос к домену, а не к localhost.
Добавьте в ALLOWED_HOSTS недостающие адреса:
ALLOWED_HOSTS = [
'ipotnin.ru',
'www.ipotnin.ru',
'5.101.152.216', # IP вашего сервера — ВАЖНО
'localhost',
'127.0.0.1',
]После этого перезапустите Gunicorn:
sudo systemctl restart gunicornПеред повторной попыткой Certbot ОБЯЗАТЕЛЬНО проверьте результат в браузере пока через протокол http: http://cinemahub.ru.
Далее проверяем статус Gunicorn
sudo systemctl status gunicornЕсли видишь:
active (running)— окfailed/exit-code— Certbot не сможет пройти
Открой конфиг Nginx проекта:
sudo nano /etc/nginx/sites-available/myprojectВНУТРИ server {} ДО location / { добавь:
location ^~ /.well-known/acme-challenge/ {
root /var/www/html;
allow all;
}Полный порядок важен — этот блок должен быть выше прокси.
Создай папку:
sudo mkdir -p /var/www/html/.well-known/acme-challenge
sudo chmod -R 755 /var/www/htmlПерезапусти Nginx:
sudo nginx -t
sudo systemctl reload nginxТеперь откройте в браузере:
https://cinemahub.ru
Ожидаемый результат:
- сайт открывается по HTTPS;
- в адресной строке — замок;
- предупреждений о небезопасном соединении нет.
Также проверьте:
http://cinemahub.ru
Он должен автоматически перенаправлять на HTTPS.
На этом этапе Django-настройки базы данных (PostgreSQL / SQLite) не имеют значения — SSL работает на уровне Nginx.
Важно понимать, что произошло «под капотом».
Certbot:
- добавил SSL-настройки в конфигурацию Nginx;
- создал новые
server-блоки дляlisten 443 ssl; - прописал пути к сертификатам Let’s Encrypt;
- добавил редирект с HTTP на HTTPS.
Вы можете открыть файл:
/etc/nginx/sites-available/myprojectи увидеть, что конфигурация стала заметно больше — это нормально.
Сертификаты Let’s Encrypt действуют 90 дней, но мы не будем продлевать их вручную.
Certbot устанавливает системный таймер:
sudo systemctl status certbot.timerЕсли вы видите статус active, значит:
- сервис запущен;
- сертификат будет автоматически продлеваться;
- никаких действий от вас не требуется.
Чтобы убедиться, что автоматическое продление точно сработает, выполним тест:
sudo certbot renew --dry-runЭто симуляция продления, сертификат реально не обновляется.
Если команда завершилась без ошибок, значит:
- при реальном истечении срока сертификат продлится автоматически;
- сайт не «упадет» через 90 дней.
Причины:
- домен не указывает на IP сервера;
- порт 80 или 443 закрыт firewall’ом;
- Nginx не запущен.
Проверьте:
sudo systemctl status nginx
sudo ufw statusПричины:
- ошибка в конфигурации Nginx;
- Gunicorn не запущен;
- неверный путь к
site.sock.
Проверьте:
sudo nginx -t
sudo systemctl status gunicorn