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

    @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
    Ответ написан
    Комментировать
  • Из за чего не подключаются стандартные скрипты и стили в админке Битрикс?

    yuraSco
    @yuraSco Автор вопроса
    В конфиге apache надо было убрать:
    <LocationMatch "/\.(?!well-known)">
        Require             all denied
    </LocationMatch>
    Ответ написан
    7 комментариев
  • Как получить gist с github в phpstorm?

    ABabiy
    @ABabiy
    фрилансер
    Здравствуйте!
    Смеяться не буду, потому как русские комментарии выводятся кракозябрами, и как побороть - не нашли возможности. Отписался в комментариях к плагину, разработчику. Пока тишина. Если есть ответ - помогите пожалуйста.
    Ответ написан
  • Как получить список товаров добавленных в сравнение (компонент catalog.compare.*)?

    babarun
    @babarun Куратор тега 1С-Битрикс
    Безумный план моих идей в руках больных людей
    Они в сессии просто хранятся

    $SESSION["имя списка сравниваемых элементов"]["ID информационного блока"]["ITEMS"]["ID элемента"]

    $_SESSION[COMPARE_NAME][IBLOCK_ID]['ITEMS'][ELEMENT_ID
    ]
    Ответ написан
    Комментировать
  • Какая CMS лучше и проще всего для сайта Знакомств?

    zooks
    @zooks
    Frontend
    October CMS на базе Laravel.
    Ответ написан
    Комментировать
  • Как открывать несколько окон PhpStorm с разными проектами?

    vasilyev
    @vasilyev
    php, 1c-bitrix
    Согласен с @begemot_sun. Но добавлю. Как-то раз вы могли выбрать This Window и нажать на галочку Don't ask me again. Чтобы спросил опять -- File->Settings->General->Project Opening.
    Ответ написан
    Комментировать
  • Форматирование кода в phpstorm, возможно ли автоматизировано так выравнивать код?

    zorro76
    @zorro76
    Все очень просто – выделите фрагмент кода, который надо отформатировать и нажмите Ctrl+Alt+L, либо воспользуйтесь меню (Code -> Reformat code…)

    кроме того File -> Settings -> Code Style здесь вы можете настраивать отображение кода
    Ответ написан
    8 комментариев
  • Как добавить свои классы li, a в wp_nav_menu?

    deniscopro
    @deniscopro Куратор тега WordPress
    WordPress-разработчик, denisco.pro
    Ну либо в Внешний вид -> Меню в верхнем правом углу открыть Настройки экрана, включить классы CSS и прописать нужные пунктам, либо подобрать фильтр.
    Например, попробовать так
    add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 2);
    
    function special_nav_class($classes, $item){
        $classes[] = 'your-custom-class';
        return $classes;
    }

    Видео с примерами.
    Ответ написан
    5 комментариев
  • Где шаблон списка товаров в woocommerce?

    Palych_tw
    @Palych_tw
    Типа веб-разработчик
    изменение archive-product.php не даст результат если у вас в теме есть woocommerce.php. О чем в админке и написано
    В вашей теме содержится файл woocommerce.php, вы не сможете переопределить кастомный шаблон woocommerce/archive-product.php с тех пор, как woocommerce.php получил приоритет над archive-product.php. Это предотвращает проблемы с отображением.

    Можно сделать в woocommerce.php такой код
    <?php
                        if ( is_singular( 'product' ) ) {
                            woocommerce_content();
                        }else{
                            //For ANY product archive.
                            //Product taxonomy, product search or /shop landing
                            wc_get_template( 'archive-product.php' );
                        }
                        ?>

    Это условие для страниц продукта будет использовать woocommerce_content(); , а для любых страниц каталога (категория, поиск и т.д.) будет подключать archive-product.php
    Ну и конечно же, все редактируемы шаблоны плагина копируйте себе в папку с темой.
    Ответ написан
    2 комментария
  • Как в bootstrap 4 менять местами блоки при адаптации?

    @djv57
    Вот тут есть пример для изменения порядка вывода двух колонок в Bootstrap 4 при изменении разрешения:
    https://ru.stackoverflow.com/a/941035/325821
    Ответ написан
    2 комментария
  • Как развиваться python-программисту от начального уровня до junior и дальше?

    @kova1ev
    я вижу это так:
    1) сначала книги по базовым основам, их много, писать простые консольные скрипты, решать задачки на сайтах типа checkio и codewars
    2)изучить джангу, или можно сначала фласк, а потом джангу, попробовать сделать простейшее crud приложение с sqlite3 базой.
    3)потом идешь на кэгл, вкуриваешь основы машинного обучения, ищешь какое-нибудь интересное прошедшее соревнование, заходишь в кернэлы и дискуссии, смотришь решения, которые дают хороший результат (часто победители выкладывают свои решения).
    4)Берешь решение, обучаешь свою модель и запиливаешь ее на свой джанго-сайт, типа приложение "предсказываем то-то то-то"
    5)идешь устраиваться джуном, всем показываешь свое приложение.
    Ответ написан
    Комментировать
  • Как оптимизировать изображения по PageSpeed Insights?

    @brashik
    Все что написано выше на текущий момент не актуально ! Гугл уже хочет чтобы мы меняли формат изображения, вот что пишет...

    Используйте современные форматы изображений
    Для изображений в форматах JPEG 2000, JPEG XR и WebP используется более эффективное сжатие, поэтому они загружаются быстрее и потребляют меньше трафика, чем изображения PNG и JPEG.

    и кстати скачать файлы уже не позволяет...
    Ответ написан
    Комментировать
  • IDE для Node.js?

    andoriyu
    @andoriyu
    www.akshell.com/ Автор где-то на хабре.
    Ответ написан
    Комментировать
  • IDE для Node.js?

    dizballanze
    @dizballanze
    Software developer at Yandex
    Cloud 9 — вот облачная ide специально для разработки на javascript
    Ответ написан
    Комментировать
  • Как установить composer и как им пользоваться под windows?

    K-2
    @K-2 Автор вопроса
    Постараюсь подвести первые итоги.

    Composer можно пользоваться в 2х вариантах.
    Глобально(установив программу) и Локально(ничего не устонавливая)
    И тот и тот способы работают только из командной строки. (Пуск->Стандартные->Командная строка)
    Для того чтобы что-то скопировать в командную строку ctrl+v не работает! Пользуемся правой кнопкой мышки->вставить

    ЛОКАЛЬНО пошагово
    1. Создаем папку, в которой будет проект на компьютере.
    2. В Командной строке пишем команду cd и путь к папке с проектом:
    cd C:\xampp\htdocs\test_composer
    3. Т.к. программа не установлена, нужен загрузочный файл(мини-программа composer), для его загрузки в Командной строке пишем команду:
    php -r "readfile('https://getcomposer.org/installer');" | php
    теперь в директории появился загрузочный файл
    4. Запускаем команду загрузки фреймворка(у каждого свой), в Командной строке пишем:
    php composer.phar require silex/silex ~1.1 (для фреймворка silex)

    В Командной строке, команды запускаются по разному при локальной и глобальной загрузках:
    Локально: php composer.phar require silex/silex ~1.1
    Глобально: composer require silex/silex ~1.1
    php composer.phar меняется на composer
    Еще при локальной загрузке нужно каждый раз закачивать установочный файл(это не сложно и описано в шаге 3):php -r "readfile('https://getcomposer.org/installer');" | php
    При глобальной загрузке этот файл не нужен.

    ГЛОБАЛЬНО пошагово
    1. Скачиваем программу composer https://getcomposer.org/Composer-Setup.exe
    2. Запускаем. При запросе файла php указываем путь к локальному хостингу -> папку php
    3. Теперь делаем все тоже самое что и при локальной загрузке, но пропускаем шаг 3, и изменяем запросы из Командной строки(вместо php composer.phar пишем composer). Пример:
    было так: php composer.phar require silex/silex ~1.1
    стало так: composer require silex/silex ~1.1

    О других отличиях между глобальной и локальной загрузками пока-что тут ничего не ответили!
    Ответ написан
    1 комментарий
  • В чем разница между Git и GitHub?

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

    Сразу скажу, разницу не знаю между ними, но сам башем пользуюсь, потому что привык к консоли.
    Ответ написан
    Комментировать
  • В чем разница между Git и GitHub?

    @SolidMinus
    Та же, что и porn и pornhub ;)

    Первое - название системы, вторая там где все это лежит
    Ответ написан
    1 комментарий
  • Boostrap скрипты во вкладках и слайдере прогружаются в последнюю очередь?

    @kttotto
    пофиг на чем писать
    А Вы видели что при каждом клике слайдера в консоль ошибка летит?
    Index.html:43 Uncaught TypeError: $(...).animate is not a function
        at HTMLAnchorElement.<anonymous> (Index.html:43)
        at HTMLAnchorElement.dispatch (

    Надо разбираться почему $('html, body') не имеет функции animate(). Могу предположить, что не хватает каких-то библиотек jQuery.
    Ответ написан
    3 комментария