Sock JS + Proxy + Apache2: wss: // не работает, только опрос - PullRequest
0 голосов
/ 10 апреля 2020

Я получил следующую настройку:

  1. Интерфейс с Sock JS
  2. Сервер шлюза, перенаправляет запросы Socket на сервер узла Sock JS и все остальное на loadbalancer

Веб-сокеты работают, но только с опросом. При попытке подключения к серверу sock JS в браузере появляется следующая ошибка:

websocket.js:6 WebSocket connection to 'wss://mypage.com/... failed: Error during WebSocket handshake: Unexpected response code: 500. Сервер Sock JS не регистрирует никаких ошибок.

Я вижу в devtools, что есть открытый запрос HTTP https://mypage.com/socket/225/ye1ifrre/xhr_streaming?..., но wss: //, похоже, не работает.

Это мой шлюз apache2 VHOST (я заменил некоторое содержимое на ...):

<VirtualHost *:80>
    # redirect all to HTTPS
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
<VirtualHost *:443>
    # WebApp VHOST

    ServerName mypage.com

    # Set HSTS
    LoadModule headers_module modules/mod_headers.so
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"


    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCipherSuite ...
    SSLCertificateFile /...
    SSLCertificateKeyFile /...
    SSLCACertificateFile /...

    SetEnvIf Referer mypage.com localreferer
    <Location /api>
       Order deny,allow
             Allow from all
    </Location>
    # Proxy All to Application Server Load Balancer except websocket
    ProxyPreserveHost On

    # Websocket Proxy Bypass
    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
    RewriteRule .* ws://10.2.0.7:9000%{REQUEST_URI} [P]
    ProxyPass /socket http://10.2.0.7:9000/socket
    ProxyPassReverse /socket http://10.2.0.7:9000/socket

    ProxyRequests off

    ProxyPass / http://10.2.0.10:80/
    ProxyPassReverse / http://10.2.0.10:80/

    # Set response headers
    Header set X-Content-Type-Options "nosniff"
    Header set Content-Security-Policy "..."
        Header set Referrer-Policy "same-origin"
    Header set X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"

</VirtualHost>

На моем сервере sock JS я слушаю 10.2.0.7:9000. В нашей среде тестирования, где сервер sock JS работает на той же виртуальной машине, что и шлюз, он работает. Там я передаю запросы websockets на 127.0.0.1:9000 и сервер sock JS также прослушивает 127.0.0.1:9000.

Я использую Sock JS Client 1.4.0 и сервер Sock JS узла 0.3.20 .

Что мне здесь не хватает? Может ли быть проблема с моими заголовками CSP? Я думаю, что тогда я должен получить связанную ошибку от Chrome.

Я прочитал, что это может быть проблема с sock JS, не слушающим на 127.0.0.1, или что запрос сокета от клиента имеет быть сделано по IP-адресу вместо домена. У кого-нибудь еще была / была такая же проблема?

1 Ответ

0 голосов
/ 11 апреля 2020

После просмотра моих apache журналов ошибок я увидел сообщение No protocol handler was valid for the URL /socket/316/i0hkgyrq/websocket. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule..

Оказывается, мне пришлось включить мод прокси webtunnel, запустив команду sudo a2enmod proxy_wstunnel. Теперь все работает, и я вижу соединение websocket в devtools под WS -Tab

...