Возможно, опыт кому-то будет полезен, а может, кто-то в комментариях подскажет слабое место, или что я упустил. Все реальные адреса в тексте заменены на произвольные. В конце сообщения по ссылке приложены конфиги Nginx, которые можно взять за шаблон.
При настройке Nginx я опирался на 3 инструкции:
- Родная, из документации 1С-Элемент: Установка и настройка обратного прокси-сервера nginx
- Ещё родная про заголовки X-Forwarded: Обратный прокси-сервер
- Найденная на просторах интернета, Уварова А.С.: interface31.ru
Итак, какие исходные данные?
- Имеем в локальной сети сервер на Ubuntu 24.10 с работающим сервером 1С-Элемент и установленным и подключенным Gitlab.
- Локальный адрес сервера 192.168.0.100
- Сервер элемент работает на портах 9090 и 9091, по умолчанию.
- Есть белый IP, локальная сеть находится за роутером, который отсекает лишние порты.
- Белый IP: 40.41.42.42
- Есть домен 3 уровня 1c-element.somesite.ru на котором мы хотим показать клиенту результаты разработки, либо развернуть продуктовое приложение.
- Есть веб-публикация 1С на локальном адресе 192.168.0.200, которая сейчас проброшена на внешний 80ый порт и работает на домене demo1c.somesite.ru/Baza1C
- Нужно предоставить доступ к демо-приложению на 1С-Элемент, с локальным адресом: 192.168.0.100:9090/applications/demo-app
Шаг 1: Установка Nginx
Я приведу путь, которым прошёл сам) а подробности по ссылке, поскольку впихнуть в пост телеграмма всё подробно не получится.
apt update
apt install nginx
systemctl start nginx
systemctl status nginx
ВАЖНЫЙ МОМЕНТ! Если установили Gitlab, то обратный Nginx у вас уже работает и порты 80 и 443 заняты. Я настраивать этот же Nginx как обратный прокси-сервер не захотел, так как вероятен переезд Nginx на другой сервер, так же не захотел переносить Gitlab на другие порты, поэтому сразу после установки Nginx, исправляем конфигурацию на порты 88 и 1443.
Создадим каталоги для хранения настроек по сайтам:
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
Откроем файл /etc/nginx/nginx.conf и после строки
include /etc/nginx/conf.d/*.conf;
Добавим:
include /etc/nginx/sites-enabled/*;
Таким образом мы выполнили установку и базовую подготовку Nginx, далее нужно подготовить правильные конфигурационные файлы.
Но сперва…
Шаг 2: Привязка домена, проброс портов
В панели управления хостинг провайдера у поддомена 3 уровня (1c-element.somesite.ru) удаляем A-записи, и добавляем новую A 40.41.42.42 - таким образом говорим системе DNS куда отправлять запросы для этого домена.
Просим системного администратора настроить проброс портов с белого IP-адреса на наш внутренний прокси:
40.41.42.42:80 -> 192.168.0.100:88
40.41.42.42:443 -> 192.168.0.100:1443
Возможно, что на роутере порты 80 и 443 уже куда-то проброшены, в таком случае надо будет настроить эти ресурсы через обратный прокси, а настройку согласовать с потребителем, который занимает порт, что какое-то время порты будут недоступны. В нашем случае на 80 порту работала веб-публикация демо-базы 1С, которую мы показывали клиентам. Перенастроили её через обратный прокси с SSL-сертификатом.
В случае успешной проброски портов, по адресу 40.41.42.42:80 должна отображаться приветственная страница Nginx, такая же как по адресу 192.168.0.100:88.
Шаг 3: Конфигурирование Nginx для HTTP протокола
Первым делом надо восстановить работоспособность публикации базы 1С, которая работала по адресу demo1c.somesite.ru/Baza1C.
Для этого в каталоге: "/etc/nginx/sites-available/" создаём файл "demo1c.somesite.ru.conf":
nano /etc/nginx/sites-available/demo1c.somesite.ru.conf
И записываем вот такой конфиг:
server {
listen 88;
server_name demo1c.somesite.ru;
location /Baza1C {
proxy_pass http://192.168.0.200/Baza1C/;
proxy_redirect off;
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 http;
}
location / {
return 404;
}
}
Создаем символическую ссылку на конфиг:
ln -s /etc/nginx/sites-available/demo1c.somesite.ru.conf /etc/nginx/sites-enabled
Проверяем конфиги на наличие ошибок и перезапускаем Nginx:
nginx -t
nginx -s reload
Теперь по адресу demo1c.somesite.ru/Baza1C должна возобновить работу веб-публикация базы 1С.
Шаг 4: Установка и настройка Let's Encrypt
Переведём работу публикации 1С на протокол https. Я следовал именно таким путём, потому что веб-публикацию 1С оказалось проще настроить и запустить чем сервер 1С-Элемент. Поэтому эту задачу я рассматриваю как удобный способ потренироваться.
Установим Certbot:
apt install certbot
Создадим директорию для работы Letsencrypt, которую будем использовать в конфигах Nginx:
mkdir /var/www/letsencrypt
chown -R nginx:nginx /var/www/letsencrypt
Создадим файл параметров Диффи-Хелмана:
openssl dhparam -out /etc/ssl/private/dhparam.pem 2048
Теперь мы готовы запросить сертификаты для доменов.
Шаг 5: Конфигурирование Nginx для HTTPS протокола
Сохраним где-нибудь файл "/etc/nginx/sites-available/demo1c.somesite.ru.conf" на всякий случай, а потом заменим его содержимое вот на такое:
server {
listen 88;
server_name demo1c.somesite.ru;
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
location = /.well-known/acme-challenge/ {
return 404;
}
}
Такая конфигурация понадобится для получения SSL-сертификата.
Проверяем конфиги на наличие ошибок и перезапускаем Nginx:
nginx -t
nginx -s reload
Запустим Certbot и получим сертификат для домена:
certbot certonly --webroot -w /var/www/letsencrypt -d demo1c.somesite.ru
Затем откроем файл с настройками домена "/etc/letsencrypt/renewal/demo1c.somesite.ru.conf" и внесем в секцию [renewalparams] следующую опцию:
[renewalparams]
...
renew_hook = nginx -s reload
Теперь обновим файл "/etc/nginx/sites-available/demo1c.somesite.ru.conf" добавим туда ещё одну секцию "server":
server {
listen 1443 ssl http2;
server_name demo1c.somesite.ru;
ssl_certificate /etc/letsencrypt/live/demo1c.somesite.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/demo1c.somesite.ru/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_dhparam /etc/ssl/private/dhparam.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000" always;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/demo1c.somesite.ru/chain.pem;
resolver 8.8.8.8;
location /Baza1C {
proxy_pass http://192.168.0.200/Baza1C/;
proxy_redirect off;
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 https;
}
location / {
return 404;
}
}
Проверяем конфиги на наличие ошибок и перезапускаем Nginx:
nginx -t
nginx -s reload
Теперь адрес "demo1c.somesite.ru/Baza1C" готов работать по https протоколу, необходимо лишь добавить 301 редирект в секцию server для порта 88, допишем в конец секции вот такую строку: " return 301 https://$host$request_uri;" которая перенаправит любой запрос кроме запроса от Let`s Encrypt на аналогичный https адрес.
Итоговый конфиг приложу ссылкой к посту отдельным файлом.
Шаг 6: Особенности 1С-Элемент
Аналогично настраиваем конфиги для 1С-Элемента, но есть некоторые особенности.
Выделяем отдельное приложение и обеспечиваем авторизацию
В секцию server, которая отвечает за 1443 порт (за SSL соединение) надо добавить вот такие инструкции:
location /auth {
proxy_pass http://192.168.0.100:9090/auth/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
}
location / {
proxy_pass http://192.168.0.100:9090/;
proxy_set_header X-Forwarded-Endpoint /applications/demo-app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
}
Обработку пути "/auth" для обеспечения обработки авторизации, и при помощи директивы "X-Forwarded-Endpoint" ограничить доступ к конкретному приложению на 1С-Элемент.
Остальные блоки и разделы готовятся аналогично примеру с веб-публикацией 1С.
Примеры конфигурационных файлов прикрепил к статье.
Вступайте в нашу телеграмм-группу Инфостарт