Моя конечная точка весенней загрузки websocket (ws) отлично работает на локальном хосте с angular (rxstomp).
Сервер prod использует nginx (https), и я не могу подключиться к ws. FE и BE находятся на одном сервере в докере по разным URL-адресам.
Конфигурация Nginx:
location /ws {
...
proxy_pass http://backend/ws
...
}
BE:
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins(frontendUrl);
}
FE:
export function rxStompServiceFactory() {
const rxStomp = new RxStompService();
rxStomp.configure(myRxStompConfig);
rxStomp.activate();
return rxStomp;
}
export const myRxStompConfig: RxStompConfig = {
brokerURL: 'ws://localhost:8088/ws',
...
Пожалуйста помоги
Спасибо
восходящий апитест { ip_hash; сервер 127.0.0.1:8085 max_fails=1 fail_timeout=6с; сервер 127.0.0.1:8086 max_fails=1 fail_timeout=6с; поддержка активности 16; }
ЖУРНАЛ: 17.10.2022 14:30:31 [крит] 223719#223719: * 2929 SSL_do_handshake() не удалось (SSL: ошибка: 14201044: подпрограммы SSL: tls_choose_sigalg: внутренняя ошибка) при квитировании SSL, клиент: [IP], сервер: 0.0.0.0:443
Если я правильно понимаю, у вас есть 2 сервера за балансировкой нагрузки, определенной в apitest upstream. Однако прокси-прокси настроен на серверную часть, поэтому здесь есть несоответствие...
Спасибо, но это была старая конфигурация, которую я получил от системного инженера. Выложил наше решение.





Прежде всего, это наше решение, и, конечно, оно лучше, но оно работает.
Эта проблема:
BE (бэкенд) и FE (интерфейс) на одном сервере с разными URL-адресами. (fe.app.com и be.app.com) Также есть прокси-сервер nginx.
FE не может подключиться к BE через веб-сокет.
Итак, последовательность действий: интерфейс --> nginx(be.app.com) --> серверная часть
Основная проблема заключалась в авторизации (токен носителя), когда мы хотим подключиться с помощью wss к весеннему загрузочному приложению, потому что не можем отправить собственный заголовок в запросе подключения wss.
Решение:
Сохраните токен в файлах cookie и используйте его в бэкэнде TokenAuthorizationFilter.
(Here the token cookie name is Authorization)
if (request.getCookies() != null) {
for (Cookie c : request.getCookies()) {
if (Objects.equals(c.getName(), "Authorization")) {
if (!c.getValue().startsWith("Bearer"))
authorizationHeader = "Bearer " + c.getValue();
}
}
}
И используйте это вместо параметра авторизации в requestHeader.
This is the request header
String authorizationHeader = request.getHeader("Authorization");
Итак, теперь мы можем отправлять токен в куках, а серверная часть выполняет авторизацию.
Красиво, но есть другая проблема. Важно знать, как работают файлы cookie! (Поделиться cookie между субдоменом и доменом)
Конфигурация nginx также должна пересылать файлы cookie. В этом случае мы вызвали домен FE из FE (fe.app.com/wss) и в конфигурации nginx установили proxy_pass на местоположение веб-сокета BE (backendIp:port/ws)
Таким образом, BE получает файлы cookie и использует их для авторизации.
Я надеюсь, что это помогает. :)
как восходящий поток определяется в nginx? И какую ошибку вы получаете? Что-нибудь в журнале nginx?