Установка и настройка 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-сертификатом. Если у вас есть вопросы, пишите в поддержку или оставьте комментарий!

🇺🇦 Stop Russian Aggression!
See what you can do →

Выберите мессенджер

Telegram Email Forms