@sevnet
Системный аналитик, бизнес-консультант

Как настроить push&pull WebSocket RTC на ВМ Битрикс 24 с обратным проксированием nginx?

Не первый раз мучаюсь с данным вопросом, но окончательного понимания и решения так и нет. По интрентеу всё облазил, вот этот пост на форуме техподдержки Б24 уже наизусть знаю.
Но всё равно websocket не работает как положено((
Конфигурация сети такая:
NAT -> Nginx Revers Proxy -> VMBitrix.

Проксирование домена Б24 на Nginx Revers Proxy настроено так:
server {
    listen       80;
    if ($host = "ДНС адрес портала б24") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}

server {
        listen       443 ssl;
        server_name "ДНС адрес портала б24";
        access_log /var/www/httpd-logs/"ДНС адрес портала б24".access.log;
        error_log /var/www/httpd-logs/"ДНС адрес портала б24".log notice;
        ssl_certificate /etc/letsencrypt/live/"ДНС адрес портала б24"/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/"ДНС адрес портала б24"/privkey.pem; # managed by Certbot
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        location / {

                proxy_ignore_client_abort on;
                proxy_pass https://"локальный IP адрес ВМ Б24":443;
                proxy_redirect https://"локальный IP адрес ВМ Б24":443 /;
                proxy_read_timeout 300;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;
                proxy_set_header Authorization "";

                # for Push&Pull
                location /bitrix/subws {
                proxy_pass https://"локальный IP адрес ВМ Б24":443;
                proxy_set_header Upgrade $replace_upgrade;
                proxy_set_header Connection $connection_upgrade;
                proxy_redirect https://"локальный IP адрес ВМ Б24":443 /;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;
                }
         }
}

В "nginx.conf" Revers Proxy добавлены переменные:
# Bitrix WS, WSS
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' 'close';
}

map $http_upgrade  $replace_upgrade {
  default $http_upgrade;
  ''      "websocket";
}


На ВМ Б24 согласно инструкции с оф. сайта поддержки Б24 создан файл: "/etc/nginx/bx/site_ext_enabled/rtc_ext.conf", добавлены настройки в "./bitrix/.settings.php"
'pull_s1' => 'BEGIN GENERATED PUSH SETTINGS. DON\'T DELETE COMMENT!!!!',
'pull' => Array(
    'value' =>  array(
...
        'path_to_websocket' => 'ws://#DOMAIN#:1137/bitrix/subws/',
        'path_to_websocket_secure' => 'wss://#DOMAIN#:1139/bitrix/subws/',
...
    ),
),
'pull_e1' => 'END GENERATED PUSH SETTINGS. DON\'T DELETE COMMENT!!!!',

Firewall на ВМ Б24 - отключен!

Тем не менее в консоли браузера по прежнему: "WebSocket connection to '...' failed"((
4hQdz6c.png

А вот трафик с внешнего IP по портам "1137,1139,8010-8015,8070,8890-8895,9010,9011" которые так или иначе упоминались в разных источниках для настройки push&pull WebSocket RTC на ВМ Битрикс 24:
4hQeWv3.png

Вопросы:
1. Надо ли пробрасывать с внешнего IP порты 1137, 1139? И куда пробрасывать на Nginx Revers Proxy или напрямую на Б24? (Пробовал и так и так, ничего не дало, никаких изменений).
2. Если я пробрасываю порты 1137, 1139 на Nginx Revers Proxy надо ли мне их как-то в конфиге nginx дальше проксировать на ВМ Б24? Или пробросить на ВМ Б24 через iptables DNAT'ом?
3. Сертификат SSL у меня установлен на Nginx Revers Proxy (что видно из конфига), нужно ли при этом ещё один SSL сертификат устанавливать для ВМ Б24?
4. Есть какой-то вообще алгоритм настройки, проверки каждого шага?

Коллеги, очень прошу окончательно прояснить все тонкости и нюансы этого вопроса, так как сил моих уже больше нет((
  • Вопрос задан
  • 2660 просмотров
Решения вопроса 1
@sevnet Автор вопроса
Системный аналитик, бизнес-консультант
Всё таки сам разобрался, с двадцать второй попытки всё взлетело.
4hRoelc.png
4hRodMd.png
Сначала про нюансы и проблемы, с которыми столкнулся конкретно я.
1. На Б24 ВМ в моём случае порты 8010:8015,9010,9011 прослушивались не на localhost (127.0.0.1), а на IP локальной сети (сетевого интерфейса). Поэтому в моём случае необходимо было добавить в цепочку INPUT iptables правила (на Б24 ВМ):
iptables -I INPUT -p tcp --match multiport --dport 8010:8015 -j ACCEPT
iptables -I INPUT -p tcp --match multiport --dport 9010:9011 -j ACCEPT

Для того чтобы проверить, какие порты и на каких интерфейсах прослушиваем ВМ Б24 вводим:
netstat -ntulp
2. Вот в этой инструкции от Б24 всё прекрасно, кроме одного, но очень существенного момента. В ней указывается, что необходимо скачать на реверс-прокси вот этот файл bx/settings/rtc-im_settings.conf и включить его в секцию http nginx.conf. Если сделать так как сказано, у нас в данном файле окажется следующая настройка:
upstream nodejs_sub {
  ip_hash;
  keepalive 1024;
  server push:8010;
  server push:8011;
  server push:8012;
  server push:8013;
  server push:8014;
  server push:8015;
}
upstream nodejs_pub {
  ip_hash;
  keepalive 1024;
  server push:9010;
  server push:9011;
}

и даже если вы подмените переменную push на реальный IP ВМ Б24, у вас реверс-прокси в директиве
location ~* ^/bitrix/subws/ {
    access_log off;
    proxy_pass http://nodejs_sub;
    ...

будет передавать весть трафик не на 443й порт ВМ Б24, который слушает nginx ВМ Б24, а напрямую на порты push-server'а ВМ Б24, а тот в свою очередь ожидает этот трафик от nginx ВМ Б24, поэтому так работать не будет. Сам по себе push-server это модуль разработки Б24, никаких исчерпывающий инструкций по его работе в интернет просто не существует, поэтому пытаться его настроить на получение трафика от реверс-прокси гиблая идея на корню.
Следовательно действовать согласно инструкции от Б24 можно и нужно, но в указанной выше части, нужно пропустить обе директивы upstream nodejs_sub в файле bx/settings/rtc-im_settings.conf, оставить надо только обе директивы map.
3. В этом посте на форуме Б24 в предложенном конфиге для реверс-прокси nginx есть параметр
proxy_set_header Authorization "" ;
есть его применить, у вас навсегда разлогинится мобильное приложение, и даже при указании верного пароля вы не сможете залогиниться в него обратно.
4. Ни где (ни в инструкция ни на форуме Б24) не указано, что необходимо привести в соответствие в директиве http nginx.conf реверс прокси ряд параметров, которые содержатся в аналогичной директиве ВМ Б24. А это логично и соответственно необходимо для корректной работы.

В итоге вот сборка 100% работающая (быстро и без сбоев) из моих конфигов для реверс-прокси nginx:
1. Обновляем Nginx на реверс прокси, минимум до такой же версии как и на ВМ Б24, в моём случае это была версия 1.20.2, которая уже содержала необходимые пакеты nginx-extras, необходимые для передачи специальных заголовков websocket.
2. Настройки реверс-прокси nginx.
В nginx.conf в директиву http добавляем параметры из nginx.conf ВМ Б24 (у меня они собраны в bx/bx_general_proxy_settings.conf) и директивы map из файла bx/settings/rtc-im_settings.conf:
include bx/settings/rtc-im_settings.conf;
        include bx/bx_general_proxy_settings.conf;

bx/bx_general_proxy_settings.conf
proxy_connect_timeout           300;
        proxy_send_timeout              300;
        proxy_read_timeout              300;
        proxy_buffer_size               64k;
        proxy_buffers                   8 256k;
        proxy_busy_buffers_size         256k;
        proxy_temp_file_write_size      10m;

        gzip                            on;
        gzip_proxied                    any;
        gzip_static                     on;
        gzip_http_version               1.0;
        gzip_types                      application/x-javascript application/javascript text/css;

        default_type application/force-download;

        tcp_nopush                      on;
        tcp_nodelay                     on;

        client_max_body_size            1024m;
        client_body_buffer_size         4m;

bx/settings/rtc-im_settings.conf
log_format simple '$time_local $status $request';

# if connection ti not set
map $http_upgrade $connection_upgrade {
  default upgrade;
  '' 'close';
}

map $http_upgrade  $replace_upgrade {
  default $http_upgrade;
  ''      "websocket";

Конфиг для DNS Б24:
server {
    listen       80;
    if ($host = {DNS name}) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}
server {
        listen       443 ssl;
        server_name {DNS name} www.{DNS name};
        access_log /var/www/httpd-logs/{DNS name}.access.log;
        error_log /var/www/httpd-logs/{DNS name}.error.log notice;
        ssl_certificate /etc/letsencrypt/live/{DNS name}/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/{DNS name}.su/privkey.pem; # managed by Certbot
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        location / {

                proxy_ignore_client_abort on;
                proxy_pass https://{IP VM B24}:443;
                proxy_redirect https://{IP VM B24}:443 /;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;

            # for Push&Pull
            location /bitrix/subws/ {
                access_log off;
                proxy_max_temp_file_size 0;
                proxy_read_timeout  43800;
                proxy_http_version 1.1;
                proxy_pass https://{IP VM B24}:443;
                proxy_set_header Upgrade $replace_upgrade;
                proxy_set_header Connection $connection_upgrade;
                proxy_redirect https://{IP VM B24}:443 /;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;
            }
            location /bitrix/sub/ {
                access_log off;
                rewrite ^/bitrix/sub/(.*)$ /bitrix/subws/$1 break;
                proxy_pass https://{IP VM B24}:443;
                proxy_max_temp_file_size 0;
                proxy_read_timeout  43800;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;
            }

            location /bitrix/rest/ {
                access_log off;
                proxy_pass https://{IP VM B24}:443;
                proxy_max_temp_file_size 0;
                proxy_read_timeout  43800;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header HTTPS YES;
            }
         }

Для перечитывания конфигов используем
nginx -s reload
Для тестирования
nginx -t
Для перезагрузки
systemctl restart nginx
На ВМ Б24 не забываем включить модуль real_ip в BitrixVM – создаем конфигурационный файл bx/settings/real_ip.conf:
set_real_ip_from {IP revers-proxy};
real_ip_header X-Forwarded-For;

3. ОБЯЗАТЕЛЬНО копируем SSL сертификат и ключ c реверс-прокси на ВМ Б24 и прописываем его в bx/conf/ssl.conf. Без него - не работает! И этого ни в одной инструкции не было! При этом с реверс-прокси, мы весь трафик отправляем на https 443й порт ВМ Б24.
4. Если всё равно не работает переустановите Push-server на ВМ Б24:
4hRqc87.png
4hRqebM.png
4hRqhdx.png
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@rPman
Совершенно не понимаю, зачем эти порты пробрасывать, возможно это специфика битрикс.

Websocket - это расширение http протокола, т.е. буквально это постоянно висящее http соединение от браузера до клиента, в котором можно слать данные в обе стороны.

С точки зрения nginx прокси, это обычный http запрос, настройки там минимальны

Но у тебя внутри твоей сети должен быть поднять этот websocket сервер. Т.е. какое то приложение, которое и является этим сервером, умеющим обрабатывать не http rest а именно непрерывное подключение.
-----------------------------------------------
Либо модуль веб сервера!

Я не совсем уверен, в документации есть только пара строчек об этом
Включает использование Веб-сокетов. Активна только при использовании nginx-push-stream-module в версии 0.4.0

Используется этот модуль https://github.com/wandenberg/nginx-push-stream-module
Читай инструкции как его настраивать

т.е. веб сервер становится посредником, где уже бакэнд сможет слать к нему запросы в http rest стиле и управлять открытыми websocket каналами (и читать к примеру старые сообщения, этот момент меня огорчил, так как не нашел как бакэнд будет получать сообщения о новых данных в канале ws)
Ответ написан
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
Не занимайтесь ерундой - это все сложнее чем вам бы хотелось.
Самый простой вариант - проксируйте как есть на bitrix env и пусть он занимается сертификатами и всем остальным.


1. Надо ли пробрасывать с внешнего IP порты 1137, 1139? И куда пробрасывать на Nginx Revers Proxy или напрямую на Б24? (Пробовал и так и так, ничего не дало, никаких изменений).
2. Если я пробрасываю порты 1137, 1139 на Nginx Revers Proxy надо ли мне их как-то в конфиге nginx дальше проксировать на ВМ Б24? Или пробросить на ВМ Б24 через iptables DNAT'ом?


Эти порты, ровно как и порты 80* и 90* проксировать НЕ нужно.
Да, это было необходимо ранее, когда использовался nginx-push-stream-module, но он устарел еще на версии битрикс эдак 18-й, а с версии 22 уже требуется Bitrix NodeJS v2 - да-да именно второй (был еще и первый как промежуточный).
Он работает на двух технологиях - long polling и websocket, но главное - он работает по потому же порту что и HTTP/HTTPS, т.е. проксировать достаточно только их.


3. Сертификат SSL у меня установлен на Nginx Revers Proxy (что видно из конфига), нужно ли при этом ещё один SSL сертификат устанавливать для ВМ Б24?


Если вы хотите чтобы это корректно работало, то вам необходмо будет ЛИБО прокидывать на 443 -> 443 и безоговорочно доверять всему и ловить ошибки самого битрикса, либо дублировать сертификат на локальную машинку.

Вот только этот сертификат придется устанавливать еще на:
- nginx
- apache (http-scale сервис)
- push-service

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

Я попробую поискать наш reverse-proxy конфиг который мы используем для проброса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы