Pull to refresh

Как купить домен и использовать доменное имя для размещения сайта или своих сервисов через NGINX

Level of difficultyMedium
Reading time23 min
Views39K

Этот небольшой гайд для тех, кто давно хотел сделать свой сайт на своем домене и разместить на своем сервере, но все никак.

С чем будем работать далее:

  • Узнаем, что такое доменное имя и как оно связано с DNS.

  • Зарегистрируем свой домен и узнаем, что это быстро, легко и может стоить 199 рублей за первый год (продление может стоить дороже, а цены варьироваться в зависимости от регистратора).

  • Настроим ресурсные записи, чтобы привязать доменное имя сайта к вашему IP‑адресу. Дополнительно рассмотрим, как при помощи DDNS автоматизировать обновление адресов, если у вас нет выделенного IP.

  • Развернем виртуальную машину, на которой будет работать сайт. (аналогичные действия можно проделать и на каком‑нибудь специально выделенном для этого физическом железе или VPS).

  • Развернем http‑сервер NGINX.

  • Настроим конфигурацию для размещения сайта и проверим, что сайт‑лендинг открывается.

  • Узнаем, как прикрутить ssl сертификаты и https.

  • Если используются какие‑то другие сервисы, например, nodered, узнаем, как использовать купленный домен в своих сервисах в варианте, например, nodered.mydomainhere.ru и т.д вместо 77.88.111.222:1880 или mydomainhere.ru:1880 (т. е. поработаем с доменами третьего уровня).

  • Получим бесплатные Wildcard SSL сертификаты от Lets Encrypt при помощи утилиты Cerbot, и настроим их для использования в NGINX.

Дисклеймерный блок:

В данном материале не будет рассмотрено, как сделать сам сайт, как он устроен или как корректно вести процесс его разработки.

Материал не претендует на истину в последней инстанции. Приводится одна из многочисленных рабочих реализаций. Если у вас другой взгляд на приведенное в статье, обязательно поделитесь этим в комментариях.

В данном материале демонстрируется минимальный объем, необходимый для того, чтобы своими силами с минимумом используемых технологий можно было реализовать задуманное.

Да, можно использовать сторонние инструменты вроде Tilda.ws, Figma.com, uCoz.ru (ого, они еще работают) или им подобные, а можно и так. На вкус и цвет, как говорится.

Любое упоминание каких‑то сервисов не является их рекламой. Просто показана частная реализация: что вот здесь можно сделать вот так, и все заработает. Уловив суть происходящего, можно реализовать это и на альтернативных сервисах.

Тех, кому интересно, приглашаю далее.

Что такое доменное имя, зачем оно нужно и причем тут DNS?

Доменное имя — это сетевой идентификатор веб‑сайта или веб‑сервиса. Оно действует как адрес, который люди могут использовать для доступа к сайту в Интернете. Доменное имя представляет собой комбинацию букв и/или цифр, разделенных точками (например, habr.com).

Проще говоря, считайте, что доменное имя — это имя контакта в записной книге телефона. Точно так же, как вы используете имя контакта, связанное с телефонным номером, чтобы позвонить кому‑то, вы используете доменное имя для доступа к веб‑сайту. Разница в том, что вместо вызова контакта вы вводите доменное имя в адресную строку веб‑браузера.

Важность доменного имени заключается в его уникальности. Никакие два сайта не могут иметь одинаковое доменное имя, что гарантирует, что люди смогут легко найти нужный им сайт. Это облегчает частным лицам и компаниям создание своего присутствия в Интернете и охват более широкой аудитории.

Система доменных имен (DNS — Domain Name System) — это протокол, который позволяет браузеру найти запрошенный пользователем сайт по его доменному имени.

Считайте, что DNS — это гигантская телефонная книга, в которой доменные имена сопоставлены с IP‑адресами. Точно так же, как вы используете телефонную книгу для поиска номера телефона человека по его имени, ваш браузер использует DNS для поиска IP‑адреса веб‑сайта по его доменному имени. Каждому имени сайта соответствует набор цифр формата 000.000.000.000, называемым IP‑адресом (если мы про классический IPv4).

Когда пользователь вводит в адресной строке браузера имя сайта, например habr.com, компьютер запрашивает IP‑адрес этого сайта на специальном DNS‑сервере и после получения корректного ответа (178.248.237.68) открывает сам сайт, что и показано на рисунке.

Обращаясь к сайту по имени habr.com мы на самом деле обращаемся к IP-адресу 178.248.237.68
Обращаясь к сайту по имени habr.com мы на самом деле обращаемся к IP-адресу 178.248.237.68
Для тех, кому интересно посмотреть, как это работает схематично и по шагам:

Пояснение по шагам:

  1. Вы вводите название сайта в адресную строку и нажимаете Enter. Увлекательная история DNS началась.

  2. Сначала браузер обращается к файлу hosts на компьютере (пункт 1). Да, записи в hosts всё ещё используются и воспринимаются браузером. Если в hosts есть нужный домен и запись, какой IP‑адрес ему соответствует, браузер сразу обращается к серверу, где хранятся файлы сайта, и загружает страницу (пункт 11). Если записей нет, браузер продолжает поиск.

  3. Теперь браузер обращается к DNS‑серверу интернет‑провайдера (пункт 3). Провайдеры кэшируют некоторые данные, чтобы ускорить процесс обработки запросов. Если на кэширующем DNS‑сервере интернет‑провайдера есть данные об IP‑адресе нужного домена, браузер идёт по указанному адресу на сервер и загружает сайт. Если записи нет, сервер интернет‑провайдера продолжает поиск дальше.

  4. Следующими в цепи появляются корневые DNS‑серверы (пункт 4). На корневых DNS‑серверах хранятся только данные о DNS‑серверах, которые ответственны за доменные зоны. Например, если вы ищете IP домена habr.com, то корневой DNS‑сервер отправит сервер интернет‑провайдера на DNS‑сервер, который ответственен за зону.COM.

  5. Интернет‑провайдер идёт к DNS‑серверу зоны, адрес которого дал ему корневой сервер (пункт 6). В нашем случае он идёт на DNS‑сервер зоны.COM и просит предоставить IP‑адрес домена.

  6. DNS‑сервер зоны не знает IP‑адреса доменов. Он может дать только IP‑адрес DNS‑сервера, на котором находится информация о необходимом домене (пункт 7).

  7. Затем интернет‑провайдер идёт к DNS‑серверу, на который его послал сервер зоны (пункт 8). Он обращается к DNS‑серверу домена (например, данные о доменах клиентов reg.ru находятся на ns1.reg.ru ns2.reg.ru). Сервер домена находит запрашиваемый домен в своей базе и отдаёт IP‑адрес интернет‑провайдеру (пункт 9).

  8. Полученный IP‑адрес интернет‑провайдер кэширует на своем сервере и отправляет найденный адрес браузеру пользователя (пункт 10).

  9. Браузер обращается к серверу, где лежат файлы нужного сайта (пункт 11).

  10. Сайт открывается на экране пользователя.

Шаг 1. Зарегистрируем свой домен, настроим ресурсные записи, получим сертификаты

Путь самурая начинается с того, что необходимо арендовать себе в пользование доменное имя, которое он хочет использовать. Для этого можно воспользоваться любым из многочисленных регистраторов доменных имен. В данном примере будет рассматриваться регистратор reg.ru. Из чего будет состоять путь?

  1. Необходимо создать учетную запись: reg.ru/user/authorize?mode=register

  2. Подтвердить почту, номер телефона, включить двухфакторную аутентификацию.

  3. Заполнить контакты владельца аккаунта (нужны данные паспорта, процесс описывать не буду, все стандартно и с пояснениями на самом сайте).

Пример внешнего вида заполненного личного кабинета
Пример внешнего вида заполненного личного кабинета
  1. Задать для поиска необходимое доменное имя: reg.ru/buy/domains/. Например:

Важно: по ходу всей статьи будет использоваться пример доменного имени superpuperhabr, вместо него вам необходимо использовать свой домен, который вы арендуете.

  1. В доменной зоне.RU домен стоит 199₽ в год (или чуть больше 50 копеек в день). (Важно понимании, что продление уже будет дороже). Все платные опции можно со спокойной душой отключить. А чтобы «поиграться» в дальнейшем с настройками https (и ssl) можно получить бесплатные сертификаты на 6 месяцев. Выглядит это примерно следующим образом, остается только оплатить любым удобным способом.

  1. Далее, зададим настройку, которая связывает доменное имя и ваш IP‑адрес (условно, создаем запись в большой телефонной книге DNS, что за вашим именем такой‑то номер телефона). Для этого необходимо провалиться в раздел меню «Домены» и перейти в раздел настроек «DNS‑серверы и управление зоной»:

  1. В данном разделе необходимо «Добавить запись», а из предложенного списка выбрать «A‑запись», которая очень просто заполняется следующим образом:

Свой публичный адрес, который необходимо указать в поле «IP Address» можно найти на 2ip.ru, например:

Соответственно итоговый результат будет выглядеть следующим образом:

Поздравляю! Теперь вы владелец домена, который будет работать также, как и habr.com!
Поздравляю! Теперь вы владелец домена, который будет работать также, как и habr.com!

Данная запись означает, что основной домен «superpuperhabr.ru» и его поддомены, например: «stage.superpuperhabr.ru» или «home‑camera.superpuperhabr.ru» или любой другой домен третьего уровня, будут перенаправлены на указанный вами IP‑адрес.

Тут есть нюанс: так как все мы делаем своими силами и пользуемся IP‑адресом, который выдает нашему роутеру интернет‑провайдер, надо учитывать, что он может измениться. Для наличия у себя постоянного «белого» публичного IP‑адреса, который будет закреплен только за вами, у провайдера необходимо подключить дополнительную услугу, названия которой примерно следующее: «Постоянный IP-адрес». Другие производные а-ля «Белый IP‑адрес», «Реальный IP‑адрес» - могут быть и динамическими, уточняйте описание услуги.

Если желания платить за такую услугу нет, надо понимать риски: в случае изменения у вас внешнего публичного IP‑адреса, его необходимо будет изменить вручную в настройках выше. Все то время, что будет указан старый адрес + 15 минут на применение внесенных изменений, сайт и другие сервисы, использующие доменное имя будут недоступны.

Как полумеру здесь можно использовать DDNS, чтобы IP‑адрес в случае изменения автоматически подтягивался к доменному имени, но про это в самом конце статьи.

Сертификаты от Reg.ru

После всех настроек спустя какое-то время вам на почту придут сертификаты от reg.ru. Из всего того объема информации, что будет в письме, необходимо создать два файла.

Итоговый сертификат и приватный ключ.

Для создания итогового сертификата необходимо объединить три сертификата «по меньше» (сам SSL‑сертификат, корневой и промежуточный сертификаты) в один файл. Для этого создайте на ПК новый текстовый документ с именем superpuperhabr.crt (superpuperhabr — доменное имя вашего сайта). Создать его можно при помощи блокнота или любого другого текстового редактора. Поочередно скопируйте и вставьте в созданный документ каждый сертификат. После вставки всех сертификатов файл должен иметь вид:

-----BEGIN CERTIFICATE-----
#Ваш сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Промежуточный сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Корневой сертификат#
-----END CERTIFICATE-----

Обратите внимание: один сертификат идёт следом за другим, без пустых строк.

Далее, создайте файл приватного ключа superpuperhabr.key и скопируйте в него содержание приватного ключа сертификата из письма.

-----BEGIN RSA PRIVATE KEY-----
#Ваш приватный ключ#
-----END RSA PRIVATE KEY-----

Еще момент: браузер может ругаться на именно эти бесплатные сертификаты, если использовать что‑то отличное от www.superpuperhabr.ru. Потому что сертификаты не поддерживают домены третьего уровня. Если занести денюжку, одним сертификатом можно покрыть все, в рамках домена и поддоменов (и superpuperhabr.ru и, например, Influx.superpuperhabr.ru).

И точно последнее по этой секции: далее мы также рассмотрим способ создания своих собственных и бесплатных wildcard ssl сертификатов через сервис let's encrypt (а раз бесплатные, то обновлять/пересоздавать их нужно будет каждые 90 дней или 3 месяца)

Шаг 2. Переходим к развертыванию ОС Debian (и созданию виртуальной машины)

Создание ВМ, установка и первичная настройка будут под спойлером, чтобы много картинок не захламляли основной текст.

Подготовка к развертыванию виртуальной машины

Если вы используете виртуальную машину, можно смотреть отсюда. Если проделывать все будете на отдельной физической машине или VPS, можете сразу перейти на момент установки ОС.

1) ПО для виртуализации и создания виртуальных машин (можете использовать любое другое, главное, чтобы была возможность настроить сетевой адаптер в режиме bridge (мост или сетевой мост))

1.1) Для Win/Linux (бесплатно для некоммерческого использования) VMware Workstation Player 17: -> тык <-

1.2) Для MacOS (есть бесплатный Trial период, либо поиск активированного решения на просторах интернета) VMware Fusion Player 13: -> тык <-

2) SSH клиент (опять же, можно пользоваться любым другим, даже встроенным в вашу систему):

2.1) Termius for Windows: -> тык <-

2.2) Termius for Linux: -> тык <-

2.3) Termius for MacOS: -> тык <-

3.1) Linux Debian 11.6 stable: -> тык <-

3.2)Или же более свежая, но тестовая сборка (очень редко установка может пойти не по плану, но пакеты и версия ядря куда свежее): -> тык <-

Установку ПО для виртуализации описывать не буду, там все элементарно. Начнем с процесса создания самой виртуалки.

Запускаем волшебного помощника через "Create a New Virtual Machine"
Запускаем волшебного помощника через "Create a New Virtual Machine"
Выбираем скачанный образ Linux Debian
Выбираем скачанный образ Linux Debian
Говорим ПО с какой ОС будем работать
Говорим ПО с какой ОС будем работать
Задаем имя для виртуалки
Задаем имя для виртуалки
Указываем максимальный объем диска (выдялется по мере того, как занимается файлами, не сразу 20GB)
Указываем максимальный объем диска (выдялется по мере того, как занимается файлами, не сразу 20GB)
Дополнительно настроим сетевой адаптер в режиме bridge через "Customize hardware"
Дополнительно настроим сетевой адаптер в режиме bridge через "Customize hardware"
Включаем режим "Bridged" и выбираем адаптер, который подключен к сети интернет (без разницы, проводной или wi-fi) через "Configure Adapters"
Включаем режим "Bridged" и выбираем адаптер, который подключен к сети интернет (без разницы, проводной или wi-fi) через "Configure Adapters"
Запускаем виртуальную машину
Запускаем виртуальную машину
Нажимаем Enter для перехода в стандартный графический установщик
Нажимаем Enter для перехода в стандартный графический установщик
Пароли, само-собой, меняете на свои :)
Пароли, само-собой, меняете на свои :)
Пароли, само-собой, меняете на свои :)
Пароли, само-собой, меняете на свои :)
На этом установка завершена. После перезагрузки системы попадаем в загрузчик, который через 5 секунд автоматически запустит установленную ОС.
На этом установка завершена. После перезагрузки системы попадаем в загрузчик, который через 5 секунд автоматически запустит установленную ОС.
После установки необходимо войти под пользователем root с паролем, который задавался при установке (и да, пароль при вводе никак не отображается, это нормально)
После ввода root-пароля просто нажимаем enter
После установки необходимо войти под пользователем root с паролем, который задавался при установке (и да, пароль при вводе никак не отображается, это нормально) После ввода root-пароля просто нажимаем enter
В конфигурации SSH необходимо разрешить подключение root пользователю, так как, все операции будем выполнять от него (не секьюрно и не по линуксоидовски, но настроить безопасность и sudo можно при желании отдельно).
Для этого вводим: nano /etc/ssh/sshd_config
В конфигурации SSH необходимо разрешить подключение root пользователю, так как, все операции будем выполнять от него (не секьюрно и не по линуксоидовски, но настроить безопасность и sudo можно при желании отдельно). Для этого вводим: nano /etc/ssh/sshd_config
Ищем закомментированную строку #PermitRootLogin prohibit-password и правим в это: PermitRootLogin yes
Записываем файл ctrl+o, enter и выходим из редактора ctrl+x.
Ищем закомментированную строку #PermitRootLogin prohibit-password и правим в это: PermitRootLogin yes Записываем файл ctrl+o, enter и выходим из редактора ctrl+x.

И перезагружаемся командой

reboot

Как видим, на старте система потребляем минимальное количество ресурсов:

Данную статистику можно посмотреть через утилитку htop. 
А чтобы ее установить необходимо ввести команду: apt install -y htop
Данную статистику можно посмотреть через утилитку htop. А чтобы ее установить необходимо ввести команду: apt install -y htop
Далее, необходимо узнать ip адрес машины для удаленного подключения через команду:
ip a
Далее, необходимо узнать ip адрес машины для удаленного подключения через команду: ip a

Скорее всего нам нужен будет именно второй интерфейс, а так как IP-адрес получаем по DHCP от роутера, то он будет примерно следующего вида: 

192.168.XXX.YYY (Например, 192.168.0.25 или 192.168.25.136). 

Узнав адрес, можно подключиться по SSH через терминал с основной машины, находящейся в одной локальной сети с сервером, следующей командой:

ssh root@192.168.50.66 

(Во всей статье будет использоваться IP-адрес 192.168.50.66, поэтому держите в уме, что в вашем случае нужно будет заменить его на актуальный IP именно для вашего сервера. Вместо IP-адреса может быть указано также доменное имя)

Остается только ввести пароль от пользователя root и можно переходить к шагу 3.

Шаг 3. Развернем HTTP‑сервер NGINX и настроим его

На установленную систему поставим пакет HTTP-сервера NGINX следующим набором команд:

apt update  && \
apt install -y wget curl gpg && \
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null && \
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg && \
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/debian bullseye nginx" | tee /etc/apt/sources.list.d/nginx.list && \
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | tee /etc/apt/preferences.d/99nginx && \
wget http://ftp.ru.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_amd64.deb && \
dpkg -i libssl1.1_1.1.1w-0+deb11u1_amd64.deb && \
rm libssl1.1_1.1.1w-0+deb11u1_amd64.deb && \
apt update && \
apt install -y nginx && \
sed -i 32i\ 'include /etc/nginx/sites-enabled/*;' /etc/nginx/nginx.conf && \
systemctl restart nginx

В терминал можно вставлять сразу весь блок, так как команды объединены связкой " && \", которая выполняет команду одну за другой, если предыдущая выполнена успешно.

Данная команда устанавливает пару утилит, для добавления репозитория NGINX, актуальный репозиторий NGINX, устанавливает соответствующий пакет и делает небольшое изменение в конфиге, перезапуская службу для применения настроек.

Далее, создадим директорию для сайта в соответствии с доменным именем, куда будут скопированы файлы сайта (вам необходимо будет изменить только доменный адрес, остальные папки системные, но их надо создать):

mkdir -m 777 -p /var/www/superpuperhabr.ru /etc/nginx/sites-available /etc/nginx/sites-enabled

Далее, создадим конфигурацию для сайта:

nano /etc/nginx/sites-available/superpuperhabr.ru

И вставим следующее содержимое:

# Первый блок настроек.
# Переадресация (редирект) с http на https
server {
	listen 80;
	server_name superpuperhabr.ru;
	return 301 https://superpuperhabr.ru$request_uri;
}

# Второй блок настроек.
server {
	listen 443 ssl;
	server_name superpuperhabr.ru;
	root /var/www/superpuperhabr.ru;

    # Указываем путь, где будут лежать сертификаты для шифрования
	ssl_certificate /etc/nginx/sites-available/superpuperhabr.crt;
	ssl_certificate_key /etc/nginx/sites-available/superpuperhabr.pem;

	index index.html;

	location / {
		try_files $uri $uri/ /index.html;
	}
}

(Не забываем поменять доменное имя superpuperhabr на свое)

Записываем файл ctrl+o, enter и выходим из редактора ctrl+x.

Данная команда создаст файл /etc/nginx/sites-available/superpuperhabr.ru с конфигурацией в которой:

Первый блок server при обращении к сайту по адресу http://superpuperhabr.ru будет переадресовывать (редиректить) его на адрес https://superpuperhabr.ru. с использованием https.

После создания конфига командой выше, необходимо разместить файлы сайта по пути: /var/www/superpuperhabr.ru

Я подготовил сайт‑заглушку через один из конструкторов сайтов. Данный сайт по сути является шаблоном для лендинга условной кофейни с отображением меню. Загрузить файлы на развернутый сервер можно двумя способами. 

  1. Либо при помощи загрузки архива сайта в расширении tar.gz через ссылку. 

  2. Либо перемещение файлов при помощи SFTP и консольной программки Termius, которая его поддерживает.

Для первого варианта: скачаем архив с файлом и распакуем в необходимую нам директорию:

wget -O /var/www/superpuperhabr.ru/landing.tar.gz -c https://clck.ru/33W2KU  && \
tar -zxvf /var/www/superpuperhabr.ru/landing.tar.gz -C /var/www/superpuperhabr.ru/  && \
rm /var/www/superpuperhabr.ru/landing.tar.gz

Первая строчка. Скачиваем архив с сайтом через утилитку wget. Флаг -O задает название файла и путь к нему, а -c загружает файл по ссылке (я использовал сократитель ссылок от Яндекса, так как архив я залил документом в VK, а там ну очень большой путь и название файла). Тут главное, чтобы вы по своей ссылке могли просто сразу скачать файл, и можно указать свою ссылку вместо моей.

Вторая строчка занимается разархивацией, третья удалением исходного архива.

Для второго варианта: можно скопировать файлы по SFTP, используя Termius, просто перетащив файлы со своего компьютера на сервер в соответствующую папку:

Простым перетаскиванием копируем файлы сайта с локальной машины на настраиваемый сервер
Простым перетаскиванием копируем файлы сайта с локальной машины на настраиваемый сервер

Созданные ранее сертификат (superpuperhabr.crt) и приватный ключ (superpuperhabr.pem) необходимо переместить по пути, указанному в конфиге: /etc/nginx/sites-available/(Либо в любое другом место на сервере, тогда не забудьте изменить путь в конфиге выше)

Простым перетаскиванием копируем файлы сертификатов с локальной машины на настраиваемый сервер.
Теперь конфигурация точно запустится, потому что все файлы на месте :)
Простым перетаскиванием копируем файлы сертификатов с локальной машины на настраиваемый сервер. Теперь конфигурация точно запустится, потому что все файлы на месте :)

Теперь говорим NGINX, чтобы он подтянул созданную нами конфигурацию и применим ее:

ln -s /etc/nginx/sites-available/superpuperhabr.ru /etc/nginx/sites-enabled && \
nginx -t && \
service nginx reload && \
systemctl restart nginx

Настройка портов

Перед проверкой, что все работает, необходимо открыть 80 и 443 порт на вашем сетевом оборудовании. Для этого необходимо зайти на роутер (в моем случае адрес 192.168.50.1), авторизоваться и перейти в раздел меню настроек WAN. Там выбрать раздел Virtual Server / Port Forwarding и настроить значения следующим образом через «Add profile». Необходимо ввести имя сервиса, порт, который открываем, тип протокола и адрес нашего сервера. (На вашем оборудовании может быть что-то одно из названий)

Port Forwarding (или Virtual Server) — настройка для WAN‑интерфейса (который отвечает за подключение к интернету), позволяющая извне (через интернет) обращаться к конкретным клиентам локальной сети (например, к нашему серверу) по определенному порту приложения.

Таким образом, можно на любом устройстве открыть браузер, ввести зарегистрированное доменное имя и указать порт необходимого приложения, и вуаля, вы зашли на приложение своего сервера. Почти также, как вы попали на habr.com

Выглядит это примерно следующим образом для роутеров ASUS:

После перезагрузки сервиса последним блоком команд, все внесенные изменения вступают в силу и теперь можно открыть свой сайт по адресу superpuperhabr.ru (будет отображаться та самая "заглушка", про которую я писал выше, с файлами которой мы работали):

Поздравляю! Вы на своем собственном железе, запустили свой собственный сайт под своим доменом :)

Да, там еще NGINX можно дополнительно конфигурировать для условно "боевой" работы, и в Docker`e все можно запустить, но в минимуме дается так. Дальше каждый может посмотреть, где и что ему подкрутить под свои нужды.

Шаг 4. Настройка проксирования через NGINX для других своих сервисов с добавлением https

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

http://77.88.111.222:1880     –>     Node-RED
http://77.88.111.222:1883     –>     Mosquitto MQTT
http://77.88.111.222:2345     –>     WireGuard VPN
http://77.88.111.222:3000     –>     Grafana
http://77.88.111.222:8086     –>     InfluxDBv2
http://77.88.111.222:8080     –>     Chirpstack-v4
http://77.88.111.222:8090     –>     Chirpstack-api

Хотелось использовать доменное имя, вместо IP-адреса, а также посмотреть, как прикрутить https и ssl, не внося изменения в настройки всего софта выше (как оказалось, делается это через проксирование в NGINX). В результате я пришел к такому формату:

https://nodered.superpuperhabr.ru           –>     Node-RED
https://grafana.superpuperhabr.ru           –>     Grafana
https://influx.superpuperhabr.ru            –>     InfluxDBv2
https://chirpstack.superpuperhabr.ru        –>     Chirpstack-v4
https://chirpstack-api.superpuperhabr.ru    –>     Chirpstack-api

Что же для этого нужно? А всего лишь добавить в NGINX конфигурацию для проксирования обращения с соответствующего имени на внутренний сервис (который localhost).

Для этого создаем конфигурацию командой:

nano /etc/nginx/sites-available/proxy

И вставляем туда следующее содержимое:

# Grafana primary listener and redirect
# Ждет обращения к адресу grafana.superpuperhabr.ru по порту 80, с переадресацией на https. 
server {
  listen 80;
  server_name grafana.superpuperhabr.ru;
  return 301 https://$host$request_uri;
}

# Grafana ssl config
# Редиректимся сюда, указываем сертификаты и адрес сервиса к которому обращаемся: http://127.0.0.1:3000
server {
  listen 443 ssl http2;
  server_name grafana.superpuperhabr.ru;

  ssl_certificate /etc/nginx/sites-available/superpuperhabr.crt;
  ssl_certificate_key /etc/nginx/sites-available/superpuperhabr.pem;

  location / {
	proxy_pass http://127.0.0.1:3000;
	proxy_set_header Host $host;
	proxy_set_header Connection "upgrade";
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}


####################################################################


# Influxdb primary listener and redirect
server {
  listen 80;
  server_name influxdb.superpuperhabr.ru;
  return 301 https://$host$request_uri;
}

# Influxdb ssl config
server {
  listen 443 ssl http2;
  server_name influxdb.superpuperhabr.ru;

  ssl_certificate /etc/nginx/sites-available/superpuperhabr.crt;
  ssl_certificate_key /etc/nginx/sites-available/superpuperhabr.pem;

  location / {
	proxy_pass http://127.0.0.1:8086;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}


####################################################################


# Nodered primary listener and redirect
server {
  listen 80;
  server_name nodered.superpuperhabr.ru;
  return 301 https://$host$request_uri;
}

# Nodered ssl config
server {
  listen 443 ssl http2;
  server_name nodered.superpuperhabr.ru;

  ssl_certificate /etc/nginx/sites-available/superpuperhabr.crt;
  ssl_certificate_key /etc/nginx/sites-available/superpuperhabr.pem;
  
  location / {
	proxy_pass http://127.0.0.1:1880;
	proxy_set_header Host $host;
	proxy_set_header Connection "upgrade";
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}


####################################################################


# Chirpstack primary listener and redirect
server {
  listen 80;
  server_name chirpstack.superpuperhabr.ru;
  return 301 https://$host$request_uri;
}

# Chirpstack ssl config
server {
  listen 443 ssl http2;
  server_name chirpstack.superpuperhabr.ru;

  ssl_certificate /etc/nginx/sites-available/superpuperhabr.crt;
  ssl_certificate_key /etc/nginx/sites-available/superpuperhabr.pem;
  
  location / {
	proxy_pass http://127.0.0.1:8080;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}


####################################################################


# Chirpstack-api primary listener and redirect
server {
  listen 80;
  server_name chirpstack-api.superpuperhabr.ru;
  return 301 https://$host$request_uri;
}

# Chirpstack-api ssl config
server {
  listen 443 ssl http2;
  server_name chirpstack-api.superpuperhabr.ru;

  ssl_certificate /etc/nginx/sites-available/superpuperhabr.crt;
  ssl_certificate_key /etc/nginx/sites-available/superpuperhabr.pem;
  
  location / {
	proxy_pass http://127.0.0.1:8090;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

Записываем файл ctrl+o, enter и выходим из редактора ctrl+x.

Данная конфигурация приведена для определенного набора сервисов. Соответственно, в зависимости от вашего набора, содержимое и состав конфига может отличаться.

Остается только применить конфигурацию, по аналогии с сайтом.

ln -s /etc/nginx/sites-available/proxy /etc/nginx/sites-enabled/proxy
nginx -t && \
service nginx reload && \
systemctl restart nginx

Теперь, при попытке открытия ссылки, например, "grafana.superpuperhabr.ru", ваш браузер обратится к reg.ru для получения IP-адреса сервера, который закреплен за доменом superpuperhabr.ru, а наш NGINX, получив данный запрос, перенаправит его на внутренний адрес сервиса Grafana http://127.0.0.1:3000 . При этом используя https и сертификаты, путь к которым указывается в конфиге выше. В виду чего нет необходимости настраивать https на каждом из сервисов.

Момент конфигурации с проксированием можно порядком упростить, перенеся его в специальное по с графическим интерфейсом: Nginx Proxy Manager поставить. Он, ко всему прочему, ещё и SSL-сертификаты может выдавать и обновлять.

Шаг 5 (опционально). Настраиваем DDNS, чтобы не менять доменные записи на reg.ru при каждом изменении IP-адреса.

Чтобы не мониторить и не обновлять IP-адрес ручками каждый раз, как сменится IP (и если вы не подключили соответствующую дополнительную услугу у вашего провайдера), можно воспользоваться сервисом DDNS, который будет делать это за вас (почти).

Функция "Динамический DNS" (Dynamic DNS / DDNS) позволяет присвоить постоянное доменное имя (адрес для доступа из интернета) публичному IP-адресу, который роутер получает от интернет-провайдера. Публичный IP-адрес может поменяться, а доменное имя, которые вы зарегистрируете – нет. (есть сервисы, позволяющие сделать это бесплатно и вне ПО роутера, рассматриваемого в данном материале).

Чтобы настроить DDNS внутренними силами того же роутера, необходимо перейти в соседний от Virtual Server / Port Forwarding пункт меню, включить службу DDNS, установить метод запроса IP -> External. Указать свободное доменное имя и зарегистрировать его (в качестве примера используется: yours-nginx-server.asuscomm.com). Когда процесс успешно завершится, применить всю конфигурацию. Через небольшой промежуток времени ваш публичный IP адрес привяжется к доменному имени, которое вы зарегистрировали и доступ к приложениям можно будет запрашивать по нему, вместо публичного IP адреса.

(ваш роутер может и не поддерживать данного функционала, поэтому посмотреть, как это сделать при помощи других сервисов, можно самостоятельно)

Остается последний шаг, сказать reg.ru, чтобы он брал адрес для вашего домена с вашего DDNS. Делается это при помощи создания CNAME записи и выглядит следующим образом:

Вы хотите, чтобы адрес grafana.superpuperhabr.ru указывал на тот же хост, что и адрес yours-nginx-server.asuscomm.com.
Для этого необходимо в поле ’Subdomain’ указать «grafana», а в поле ’Canonical name’ указать «yours-nginx-server.asuscomm.com».
Вы хотите, чтобы адрес grafana.superpuperhabr.ru указывал на тот же хост, что и адрес yours-nginx-server.asuscomm.com. Для этого необходимо в поле ’Subdomain’ указать «grafana», а в поле ’Canonical name’ указать «yours-nginx-server.asuscomm.com».

Теперь reg.ru будет обращаться к доменному имени, за которое ответственна DDNS служба, которая имеет актуальный IP-адрес, потому и reg.ru все свои запросы будет отправлять именно на него.

Кстати, что за CNAME и что там еще есть, можно посмотреть в недавней статье от Selectel: -> тык <-

Шаг 6 (опционально). Получение своих и бесплатных SSL Wildcard сертификатов при помощи сервиса Let's Encrypt для NGINX на Debian.

Вкратце разберется, а что же за Wildcard сертификаты такие.

Сертификат Wildcard - это тип сертификата SSL/TLS, который используется для защиты домена и всех его поддоменов. Например, если у вас есть сайт с доменным именем superpuperhabr.ru, сертификат Wildcard защитит не только superpuperhabr.ru, но и все поддомены, такие как blog.superpuperhabr.ru, grafana.superpuperhabr.ru и так далее.

Принцип работы сертификата Wildcard заключается в использовании специального символа, звездочки (*), в качестве обозначения любого поддомена. Поэтому вместо того, чтобы покупать отдельные SSL/TLS-сертификаты для каждого поддомена, вы можете использовать сертификат Wildcard для защиты всех поддоменов.

Основное преимущество использования сертификата Wildcard заключается в том, что он может сэкономить ваше время и деньги. Вместо того чтобы покупать и управлять отдельными SSL/TLS-сертификатами для каждого поддомена, вы можете использовать один Wildcard-сертификат для их защиты. Это может быть особенно полезно, если у вас большое количество поддоменов, поскольку управление отдельными сертификатами для каждого поддомена может отнимать много времени и средств.

Еще одним преимуществом использования сертификата Wildcard является упрощение управления сертификатами SSL/TLS. Поскольку все ваши поддомены покрываются одним сертификатом, вам нужно обновлять и управлять только одним сертификатом, а не несколькими. Это может облегчить отслеживание сертификатов и гарантировать, что они всегда актуальны и правильно настроены.

Однако есть и некоторые потенциальные недостатки использования сертификата Wildcard, о которых следует знать студентам. Во-первых, сертификаты Wildcard могут быть дороже отдельных сертификатов SSL/TLS, в зависимости от выбранного вами поставщика. Кроме того, сертификаты Wildcard не всегда подходят для определенных типов веб-сайтов, например, для тех, которые требуют сертификатов с расширенной проверкой (EV).

На reg.ru стоимость такого сертификата начинается с примерно с 10 тысяч рублей:

Б - Бизнес
Б - Бизнес

Но можно не платить, а выпустить сертификат самостоятельно при помощи сервиса Let's Encrypt!

Let's Encrypt - это бесплатный, автоматизированный и открытый центр сертификации, который предоставляет SSL/TLS-сертификаты для веб-сайтов. Let's Encrypt предлагает сертификат Wildcard, который можно использовать для защиты домена и всех его поддоменов.

Используя сертификат Wildcard от Let's Encrypt, вы можете сэкономить время и деньги, поскольку вам не нужно приобретать SSL/TLS-сертификаты для каждого поддомена. Сертификат Wildcard от Let's Encrypt также прост в установке и управлении, поскольку его можно автоматически обновлять раз в три месяца (срок действия сертификатов) и настраивать с помощью автоматизированных инструментов Let's Encrypt.

Что для этого нужно?

Установим утилиту Certbot, которая занимается выпуском сертификатов через Let's Encrypt:

apt install -y certbot python3-certbot-nginx

После чего необходимо командой запустить процесс выпуска сертификатов:

certbot -d *.superpuperhabr.ru -d superpuperhabr.ru --manual --preferred-challenges dns certonly --server https://acme-v02.api.letsencrypt.org/directory

Вас попросят указать e-mail, на который зарегистрирован домен. И задать две TXT записи, после добавления каждой из TXT записей следует подождать 10-15 минут, чтобы эта запись обновилась на сервере и Certbot мог ее прочитать после чего можно переходить к следующему шагу. Добавление выглядит примерно следующим образом:

Делается это для того, чтобы сервис проверил, действительно ли вы являетесь владельцем домена, так как только он может добавить указанные в терминале TXT строки в доменные записи.

В результате вам в терминал будут выведены пути сертификатов, которые необходимо будет поправить в файле /etc/nginx/sites-available/proxy (если речь про сторонние сервисы, которые проксируются) или /etc/nginx/sites-available/superpuperhabr.ru (если речь про ваш сайт). Соответственно, меняете этот фрагмент в конфингах:

  ssl_certificate /etc/nginx/sites-available/superpuperhabr.crt;
  ssl_certificate_key /etc/nginx/sites-available/superpuperhabr.pem;

На тот, что был выведен в терминале по завершении работы Cerbot:

  ssl_certificate /etc/letsencrypt/live/superpuperhabr.ru/fullchain.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/superpuperhabr.ru/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/superpuperhabr.ru/privkey.pem;

После указания новых путей к сертификатам в конфигах, необходимо применить конфигурацию NGINX:

sudo nginx -t && \
sudo service nginx reload && \
sudo systemctl restart nginx

Поскольку сертификаты действительны лишь три месяца, и чтобы не запускать постоянно команду на обновление:

certbot renew --force-renewal --post-hook "systemctl restart nginx"

Можно создать службу:

nano /etc/systemd/system/certbot-renewal.service

С содержимым:

[Unit]
Description=Certbot Renewal
[Service]
ExecStart=/usr/bin/certbot renew --force-renewal --post-hook "systemctl restart nginx"

И таймер:

nano /etc/systemd/system/certbot-renewal.timer

С содержимым:

[Unit]
Description=Timer for Certbot Renewal
[Timer]
OnBootSec=100
OnUnitActiveSec=1w
[Install]
WantedBy=multi-user.target

Пофиксим ошибку не указания nginx в конфиге перевыпуск сертификата:

sudo sed -i 's/manual/nginx/' /etc/letsencrypt/renewal/superpuperhabr.ru.conf

И запустим службу:

systemctl start certbot-renewal.timer && \
systemctl enable certbot-renewal.timer && \
systemctl status certbot-renewal.timer

У вас бесплатные Wildcard сертификаты на домен и его поддомены, а их выпуск автоматизирован на раз в неделю.

На этом все :) А самурай может дальше продолжать свой путь.

Tags:
Hubs:
Total votes 8: ↑5 and ↓3+2
Comments25

Articles