Перейти до основного вмісту

Налаштування 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 все працює.