Apache + Socket.io приводит к ошибке при установлении соединения websocket на Mac - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть node.js с модулем socket.io, и пример обучающего чата прекрасно работает на localhost: 3000.

У меня также есть сервер Apache, где я размещаю все свои файлы php для проекта.Сервер работает нормально на localhost: 8080.

Часть проекта передает сообщение после нажатия кнопки отправки в форме на странице, которая создается скриптом compose.php на сервере Apache.При нажатии кнопки send необходимо установить соединение через веб-сокет (если еще нет) и отправить тестовый сигнал.Так же, как пример учебного чата.Но этого никогда не происходит.

При рассмотрении проблемы на консоли Chrome / сети возникают следующие ошибки:

Консоль:

WebSocket connection to 'ws://localhost:8080/socket.io/?EIO=3&transport=websocket&sid=dhRg2iHG7dJqL3JEAAF4' failed: Error during WebSocket handshake: Unexpected response code: 302

Сеть:

Первая:

Request URL: ws://localhost:8080/socket.io/?EIO=3&transport=websocket&sid=BFoFZNDQamsdNurlAAIr
Request Method: GET
Status Code: 302 Found
Content-Length: 273
Content-Type: text/html; charset=iso-8859-1
Date: Sat, 29 Sep 2018 11:43:07 GMT
Location: ws://localhost:3000/socket.io/?EIO=3&transport=websocket&sid=BFoFZNDQamsdNurlAAIr
Server: Apache/2.4.33 (Unix) OpenSSL/1.0.2o PHP/7.2.6 mod_perl/2.0.8-dev Perl/v5.16.3
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ru;q=0.8,ja;q=0.7,uk;q=0.6
Cache-Control: no-cache
Connection: Upgrade
Cookie: PHPSESSID=aaa8a06d8e58534d5ebbe62919085074; io=BFoFZNDQamsdNurlAAIr
Host: localhost:8080
Origin: http://localhost:8080
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: WqB/VJfA2Fx/+0BrcHPnBA==
Sec-WebSocket-Version: 13
Upgrade: websocket
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
EIO: 3
transport: websocket
sid: BFoFZNDQamsdNurlAAIr

Тогда:

Request URL: http://localhost:3000/socket.io/?EIO=3&transport=polling&t=MOb913S&sid=BFoFZNDQamsdNurlAAIr
Request Method: GET
Status Code: 500 Internal Server Error
Remote Address: [::1]:3000
Referrer Policy: no-referrer-when-downgrade
Connection: keep-alive
Date: Sat, 29 Sep 2018 11:43:32 GMT
Transfer-Encoding: chunked
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ru;q=0.8,ja;q=0.7,uk;q=0.6
Connection: keep-alive
Content-type: text/plain;charset=UTF-8
Cookie: PHPSESSID=aaa8a06d8e58534d5ebbe62919085074; io=BFoFZNDQamsdNurlAAIr
Host: localhost:3000
Origin: http://localhost:8080
Referer: http://localhost:8080/compose.php?crate_id=53
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
EIO: 3
transport: polling
t: MOb913S
sid: BFoFZNDQamsdNurlAAIr

Моя настройка правил перезаписи в .htaccess такова:

RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule ^/?socket.io ws://localhost:3000/socket.io/ 
RewriteRule ^/?socket.io http://localhost:3000/socket.io/ 

Я почти уверен, что проблема заключается в способе перенаправленияsocket.io звонки с localhost: 8080 на localhost: 3000.Я просто настолько плох в сетях, что совершенно не понимаю этого.Я пробовал разные конфигурации, включая настройки прокси и обратного прокси в httpd.conf, такие как:

<IfModule proxy_module>
ProxyRequests Off
ProxyPass /socket.io http://localhost:3000/socket.io/
ProxyPassReverse /socket.io http://localhost:3000/socket.io/
</IfModule>

Я пытался это исправить уже 2 недели, это сводит меня с ума.Как я могу получить socket.io на localhost: 3000 для выдачи информации по запросу со страницы, созданной localhost: 8080 / compose.php?

1 Ответ

0 голосов
/ 05 октября 2018

Как и большинство вещей, которые я не смог сделать в жизни, решение было довольно простым.

При запуске socket = io(); в файле .js, который обслуживается сервером Apache, объект сокета устанавливается как URI, которыйэто URI сервера Apache, в моем случае localhost: 8080.

При добавлении этой строки

socket.io.uri = "http://localhost:3000/";

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...