Установка и настройка Certbot (Let's Encrypt) для Nginx на Ubuntu
Этот README поможет вам настроить Nginx как обратный прокси для блога, запущенного в Docker-контейнере. Мы создадим конфигурацию для HTTP с последующим добавлением SSL через Let's Encrypt. Инструкция написана простым языком для новичков и включает пошаговые команды.
Требования
- Сервер на Ubuntu/Debian (для других ОС команды могут отличаться).
- Установленный Docker с запущенным контейнером блога.
- Домен, привязанный к IP-адресу сервера.
- Доступ к терминалу с правами
sudo
.
Установка
1. Установите необходимые пакеты
Обновите систему и установите Nginx:
sudo apt update && sudo apt upgrade -y
sudo apt install -y nginx
Для поддержки Let's Encrypt установите Certbot:
sudo apt install -y certbot python3-certbot-nginx
2. Настройте брандмауэр
Разрешите трафик для HTTP (порт 80), HTTPS (порт 443) и SSH (порт 22):
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
sudo ufw status
Это обеспечит доступ к вашему блогу и SSH-соединению.
3. Создайте конфигурацию Nginx
Создайте файл конфигурации для вашего домена:
sudo vim /etc/nginx/sites-available/your-blog.com
Вставьте следующий код, заменив:
your-blog.com
на ваш домен (например,myblog.com
).container_name:port
на имя и порт вашего Docker-контейнера (например,my-blog:3000
).
server {
listen 80;
server_name your-blog.com www.your-blog.com;
# Проксирование к Docker-контейнеру
location / {
proxy_pass http://container_name:port;
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;
}
# Поддержка проверки Let's Encrypt
location /.well-known/acme-challenge/ {
root /var/www/html;
try_files $uri $uri/ =404;
}
}
Сохраните файл (Ctrl+O, Enter, Ctrl+X в nano) и активируйте сайт:
sudo ln -s /etc/nginx/sites-available/your-blog.com /etc/nginx/sites-enabled/
Проверьте конфигурацию и перезапустите Nginx:
sudo nginx -t
sudo systemctl restart nginx
4. Установите SSL через Let's Encrypt
Чтобы добавить SSL-сертификат, выполните:
sudo certbot --nginx -d your-blog.com -d www.your-blog.com
Следуйте инструкциям Certbot:
- Укажите email для уведомлений.
- Примите условия Let's Encrypt.
- Выберите перенаправление HTTP на HTTPS (рекомендуется).
Certbot автоматически обновит конфигурацию Nginx. После выполнения команды ваш файл конфигурации /etc/nginx/sites-available/your-blog.com
будет выглядеть примерно так (замените your-blog.com
и container_name:port
на ваши значения):
server {
listen 80;
server_name your-blog.com www.your-blog.com;
# Перенаправление HTTP на HTTPS
location / {
return 301 https://$host$request_uri;
}
# Поддержка проверки Let's Encrypt
location /.well-known/acme-challenge/ {
root /var/www/html;
try_files $uri $uri/ =404;
}
}
server {
listen 443 ssl;
server_name your-blog.com www.your-blog.com;
# SSL-сертификаты от Let's Encrypt
ssl_certificate /etc/letsencrypt/live/your-blog.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-blog.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Проксирование к Docker-контейнеру
location / {
proxy_pass http://container_name:port;
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;
}
}
Что делает эта конфигурация:
- HTTP-блок (
listen 80
) перенаправляет все запросы на HTTPS. - HTTPS-блок (
listen 443 ssl
) использует сертификаты Let's Encrypt и проксирует запросы к вашему Docker-контейнеру. - Let's Encrypt добавляет файлы
options-ssl-nginx.conf
иssl-dhparams.pem
для повышения безопасности.
Проверьте и перезапустите Nginx после изменений:
sudo nginx -t
sudo systemctl restart nginx
5. Проверьте работу блога
Откройте https://your-blog.com
в браузере. Если сайт не загружается:
- Убедитесь, что контейнер работает:
docker ps
. - Проверьте, что DNS домена указывает на IP сервера.
- Посмотрите логи Nginx:
sudo tail -f /var/log/nginx/error.log
.
Обслуживание
6. Автоматическое продление сертификатов
Сертификаты Let's Encrypt действительны 90 дней. Certbot настраивает автоматическое продление. Проверьте таймер:
sudo systemctl status certbot.timer
Протестируйте продление вручную:
sudo certbot renew --dry-run
Если таймер не активен, добавьте задачу в cron:
sudo crontab -e
Вставьте:
0 3 * * * certbot renew --quiet && systemctl restart nginx
7. Проверка SSL
Проверьте сертификат:
sudo openssl s_client -connect your-blog.com:443 -servername your-blog.com | sudo openssl x509 -noout -dates
Для детального анализа используйте SSL Labs.
8. Удаление сертификата (при необходимости)
Чтобы удалить сертификат:
sudo certbot delete --cert-name your-blog.com
Перезапустите Nginx:
sudo systemctl restart nginx
Полезные советы
- Для новичков: Если что-то не работает, проверьте логи Nginx и Docker (
docker logs container_name
). - SEO: HTTPS улучшает ранжирование в поисковиках. Убедитесь, что все ссылки на сайте используют
https://
. - Далее: Настройте кэширование в Nginx для ускорения загрузки страниц.
Готово!
Ваш блог работает через Nginx с проксированием к Docker-контейнеру и защищён SSL-сертификатом. Если у вас есть вопросы, пишите в поддержку или оставьте комментарий!