WebSocket Apache2

0

Cześć, napisałem prostą apkę działającą jak czat, która wykorzystuje WebSocket i na localhost wszystko działa jak należy, jednak gdy próbuję się połączyć zdalnie z VPS to dostaję błąd w przeglądarce Firefox can’t establish a connection to the server at ws://<Adres IP>/chat-websocket/012/tjikvfl3/websocket.. Zgaduję że muszę zmienić plik konfiguracyjny na serwerze jednak pomimo wielu prób nic nie przynosi pożądanego efektu.
Konfiguracja java:

@Configuration
@EnableWebSocketMessageBroker
public class MessageBrokerConfig implements WebSocketMessageBrokerConfigurer {

    @Value("localhost")
    private String host;
    @Value("61613")
    private int port;
    @Value("/chat-websocket")
    private String endpoint;
    @Value("/app")
    private String destinationPrefix;
    @Value("/topic")
    private String stompBrokerRelay;
    @Value("login")
    private String login;
    @Value("haslo")
    private String password;

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
       registry.addEndpoint(endpoint).withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableStompBrokerRelay(stompBrokerRelay).
                setRelayHost(host).
                setRelayPort(port)
                .setSystemLogin(login)
                .setSystemPasscode(password)
                .setClientLogin(login)
                .setClientPasscode(password);
        registry.setApplicationDestinationPrefixes(destinationPrefix);
    }
}

Kod js do łączenia się z serwerem za pomocą protokołu WebSocket:

function connect() {
    let socket = new SockJS('/chat-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
       //różne funkcje do subskrypcji endpointów 
    });
}

Na serwerze wykorzystałem komendy:
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel
Plik konfiguracyjny /etc/apache2/sites-enabled/000-default.conf (tutaj próbowałem różnych konfiguracji):
1)

<VirtualHost *:80>
	Rewrite Engine On
	RewriteCond %{QUEST_STRING} 	transport=polling		[NC]
	RewriteRule /(.*)				http://localhost:8080/$1	[P]
	RewriteCond %{HTTP:Upgrade}	websocket			[NC]
	RewriteRule /(.*)				ws://localhost:8080/$1	[P,L]
	
	ProxyPass / http://localhost:8080/
	ProxyPassReverse / http://localhost:8080/
<VirtualHost>
<VirtualHost *:80>
	Rewrite Engine On
	RewriteCond %{HTTP:Upgrade}	=websocket						[NC]
	RewriteRule /chat-websocket/(.*)	ws://localhost:8080/chat-websocket/$1	[P,L]
	
	ProxyPass / http://localhost:8080/
	ProxyPassReverse / http://localhost:8080/
<VirtualHost>
<VirtualHost *:80>
	ProxyPass / http://localhost:8080/
	ProxyPassReverse / http://localhost:8080/
	<Location "/chat-websocket">
		ProxyPass "ws://localhost:8080/chat-websocket"
	<Location>
<VirtualHost>

Dodam że wcześniej dostawałem również w logach konsoli uruchomionego jara błąd: ERROR o.s.w.s.s.s.DefaultHandshakeHandler - Handshake failed due to invalid Upgrade header: null. Po zmianie pliku konfiguracyjnego tego błędu już nie ma, ale ciągle jest błąd w przeglądarce:
screenshot-20200501110308.png

Lokalnie połączenie działa jak powinno:
screenshot-20200501111549.png

1

Standardowo w takich przypadkach zacznij od tego

registry.addEndpoint(endpoint)
.setAllowedOrigins("TU_WPISZ_ADRES_KTORY_MA_ZOSTAC_PRZEPUSZCZONY_LUB_DAJ * DLA TESTU"
.withSockJS();
0
kkojot napisał(a):

Standardowo w takich przypadkach zacznij od tego

registry.addEndpoint(endpoint)
.setAllowedOrigins("TU_WPISZ_ADRES_KTORY_MA_ZOSTAC_PRZEPUSZCZONY_LUB_DAJ * DLA TESTU"
.withSockJS();

Nie wiem jak Ci dziękować :D. Wczoraj siedziałem nad tym cały dzień, nigdzie nie mogłem znaleźć pomocy, szczególnie, że byłem przekonany, że błąd jest w pliku konfiguracyjnym skoro lokalnie wszystko działało a błąd pojawiał się tylko wtedy, gdy chciałem połączyć się z VPSem. Zgaduję, że ta metoda chroni aplikację przed tym aby nawiązywać połączenie można było tylko z adresu IP serwera z którym się łączymy a nie z jakiejś innej strony? W opisie metody jest napisane: "By default, only same origin requests are allowed (empty list)." Czy to nie oznacza, że domyślnie tak jest? Wykorzystałem .setAllowedOrigins("*"), czyli jakikolwiek adres może się połączyć z moją aplikacją? Jeśli chcę żeby tylko strony z moim adresem IP mogły się łączyć z serwerem wtedy muszę napisać: .setAllowedOrigins("http://<adres_IP_serwera>")? Czy to nie jest domyślne zachowanie?

1

Jeśli nie wystawiasz tego jako zewnętrzne API dla wszystkich, to wpisz tam tylko "http://adres_domeny_twojego_czatu.pl". By default jeśli serwer stoi na localhost, to przeglądarką z localhostu się połączysz.

Jeśli dojdą Ci inni klienci, np. appka mobilna, inna strona, wtyczka w przeglądarce do testowania endpointów, czy front odpalony na innym porcie (node.js) to będziesz musiał tutaj dodać po przecinku kolejne pozycje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1