Вопрос про websocket

Хотим для приложения основанного на CUBA 7.2 добавить фильтрацию с помощью вебфильтра (WAF). Однако для его подключения необходимо указать данные параметры.

  1. Используется ли Websocket? *
  2. Укажите директорию, через которую открывается сессия WebSocket

По первому вопросу я нашел ответ в документации, что да используется для push уведомлений. А вот по второму вопросу я в раздумьях. Не могли бы подсказать или пояснить что именно нужно указать для данного вопроса?

Есть у меня предположение, что ответ на 2 вопрос это, потому что по такому запросу я могу получить описание этого файла целиком:
/app/VAADIN/vaadinPush.js?v=8.9.2-27-cuba
Если есть возможность, подтвердите или опровергните мою догадку, пожалуйста.

Вопрос всё ещё актуальный.

Добрый день.

WebSocket используется для механизма Server Push:

When you need to update a UI from another UI, possibly of another user, or from a background thread running in the server, you usually want to have the update show immediately, not when the browser happens to make the next server request. For this purpose, you can use server push that sends the data to the browser immediately. Push is based on a client-server connection, usually a WebSocket connection, that the client establishes and the server can then use to send updates to the client.

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

Глеб

@gorelov спасибо за ответ.

Тогда может быть есть предположение по какой причине браузер или веб часть приложения может слать такое количество успешных PUSH запросов и при этом не позволять войти? Мб причина в какой-то настройке(nginx или waf), которую необходимо изменить.
push

При этом в обычном режиме без веб-фильтра, но с nginx работает корректно.

А в серверном логе что то есть?

Это как раз проблема, если у вас PUSH запросы быстро завершаются с 200 кодом. Это не так, как должен работать websocket. Websocket запросы должны выглядеть как зависшие на долгое время (Pending), тогда они обеспечивают постоянное соединение.

image

Nginx конфиг у меня такой:

server {
...

    location /app {
        proxy_pass http://localhost:8080/app;

        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_read_timeout 3600;
    }

    location /app/PUSH {
        proxy_pass http://localhost:8080/app/PUSH;

        proxy_http_version 1.1;

        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 Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 86400;
    }
}

Т.е. директория для websocket это /app/PUSH
Проект на CUBA 7.2.

2 симпатии

Ого. Мне почему-то казалось, что /VAADIN/, потому что там лежит исполняемый скрипт.

Конфигурация для /PUSH присутствует, но несколько отличается от вашей.

Насколько принципиально указывать в proxy_pass путь именно до /PUSH?
У меня указан путь до /app/

Может ли на настройку влиять proxy_read_timeout и другие параметры, где мы указываем время? Просто push падает сразу с 200, а не дожидается тайм-аута.90 секунд.

    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;
    proxy_buffering            off;
    keepalive_requests         1000000000;

Вообще я не уверен точно, это эмпирически проверяется.
Если разделить настройки, то можно более аккуратно выставить таймауты для обычных запросов и для websocket. Хотя для обычных запросов тоже иногда нужен большой таймаут, а то прокси отваливается раньше, чем закончится выполнение тяжелого метода на сервере.

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

1 симпатия

Благодарю за ответ. Опробую указанные варианты.