Перейти к содержанию

Настройка Nginx + Let's Encrypt обратный прокси перед Yucca

Введение

В этой инструкции я опишу как настроить Nginx и выпустить Let's Encrypt SSL сертификат, который будет автоматически продлеваться. Nginx будет выступать как простой Web сервер перед Yucca для терминации SSL сессии и редиректа с 80 на 443 порт.
Зачем вообще устанавливать Nginx, ведь Yucca и сама может терминировать SSL и даже флаги есть? Это верно, но когда вы займёте 443 порт он будет недоступен для другого ПО, придется использовать какой-то другой, а так же не будет редиректа с HTTP на HTTPS – если вас это устраивает, то можете смело пропускать секцию с установкой и настройкой Nginx Шаг 1 и сразу перейти на Шаг 2.
Все действия я буду проделывать на Ubuntu Server 22.04, но всё тоже самое будет работать и на SUSE, CentOS, Fedora, Debian и так далее. Разве что пакетный менеджер у всех будет свой, но я надеюсь вы отличите apt от zypper 🙂

Шаг 0. Подготовка

И так нам понадобится:

  1. Хост с белым IP адресом
  2. Домен или поддомен который смотрит на этот адрес
  3. Установленная Yucca

В инструкции я буду использовать домен foobar.yuccastream.com, ваш домен будет отличаться.

nslookup foobar.yuccastream.com
Server:     127.0.0.53
Address:    127.0.0.53#53

Non-authoritative answer:
Name:   foobar.yuccastream.com
Address: 128.140.2.103

nginx1

Итак у меня есть Yucca, которая доступна по адресу http://foobar.yuccastream.com:9910

Шаг 1. Установка и настройка Nginx

Устанавливаем nginx:

sudo apt install nginx

Проверяем http://foobar.yuccastream.com

nginx2

Далее создаём конфигурационный файл для Yucca:

sudo nano /etc/nginx/conf.d/yucca.conf

Домен foobar.yuccastream.com вам нужно заменить на свой

upstream yucca_upstream {
  server 127.0.0.1:9910 fail_timeout=0;
}

server {
  listen 80;
  server_name foobar.yuccastream.com;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://yucca_upstream;
  }
}

Сохраните файл и проверьте корректность конфигурации:

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если всё корректно вы увидите syntax is ok Обновляем конфигурацию nginx:

nginx -s reload

Обновляем страничку и видим уже веб интерфейс Yucca http://foobar.yuccastream.com

nginx3

Шаг 2. Установка Certbot и выпуск letsencrypt сертификата

Устанавливаем пакеты:

sudo apt install certbot python3-certbot-nginx

Выпускаем сертификат для нашего домена:

Домен foobar.yuccastream.com вам нужно заменить на свой

sudo certbot --nginx -d foobar.yuccastream.com

nginx4

Сertbot попросит ввести E-mail (1), рекомендую ввести ваш реальный ящик, в случае если сертификат будет истекать и не продлиться автоматически Let's Encrypt пришлёт вам об этом уведомление. Также нужно будет согласится с условиями и правилами (2), (3). Далее certbot сам найдёт нужный конфигурационный файл с нужным доменом, настроит секцию с SSL и редирект, на выходе покажет вам ссылку. Можете посмотреть что в итоге получилось в файле /etc/nginx/conf.d/yucca.conf

upstream yucca_upstream {
  server 127.0.0.1:9910 fail_timeout=0;
}

server {
  server_name foobar.yuccastream.com;
  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://yucca_upstream;
  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/foobar.yuccastream.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/foobar.yuccastream.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = foobar.yuccastream.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    server_name foobar.yuccastream.com;
    return 404; # managed by Certbot
}

Рекомендую проверить, что certbot создал таймер для продления сертификата, он должен быть активен:

sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Fri 2023-09-22 11:54:02 UTC; 7min ago
    Trigger: Fri 2023-09-22 14:13:25 UTC; 2h 11min left
   Triggers:  certbot.service

Sep 22 11:54:02 foobar systemd[1]: Started Run certbot twice daily.

Обновляем стринцу http://foobar.yuccastream.com и видим что всё работает уже через HTTPS, редирект тоже работает.

nginx5

Шаг 3. Настройка безопасности

Мы настроили досту по HTTPS через nginx, но Yucca до сих пор доступна по HTTP на адресе http://foobar.yuccastream.com:9910. Это связанно вот с этой настройкой по умолчанию:

listen_address = ":9910"

Идём в конфигурационный файл Yucca и правим этот параметр:

sudo nano /opt/yucca/yucca.toml

Делаем так, чтобы Yucca слушала только localhost:

listen_address = "127.0.0.1:9910"

И перезагружаем сервер Yucca:

sudo systemctl restart yucca

Проверяем, теперь по адресу http://foobar.yuccastream.com:9910 ничего нет, а тут https://foobar.yuccastream.com всё работает.