Я получил следующую настройку:
- Интерфейс с Sock JS
- Сервер шлюза, перенаправляет запросы 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-адресу вместо домена. У кого-нибудь еще была / была такая же проблема?