Websocket отказывается от подключения, но получение и отправка по-прежнему возможны

У меня есть веб-сайт, работающий под foo.domain.com, и веб-сокет вместе с экспресс-API под api.domain.com, и всякий раз, когда я пытаюсь подключиться к нему, я получаю 400 в качестве кода ответа после подключения сокета. Однако я успешно получаю и отправляю события. Самая большая проблема заключается в том, что вкладка «Сеть» каждые несколько секунд засыпается запросами на получение и публикацию в качестве компенсации за невозможность создать отношения веб-сокета.

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

Я впервые работаю с веб-сокетами, поэтому, пожалуйста, потерпите меня.

Socket.io Версия: 2.3.0

Экспресс-версия: 4.17.1

Мой скрипт сокета работает на моем api

var listener = app.listen(6606, function () {
   console.log(`API listening on port ${listener.address().port}`)
});
let io = require('socket.io')(listener);

io.on('connection', socket => {
 console.log("Connected");
 var test = "Welcome";
 setTimeout(() => {
   socket.emit('test', test)
 }, 5000);
 socket.on('received', data => {
   console.log(data)
 })
})

И это тот, который используется в моем приложении Nuxt.js

mounted() {
  this.websocket = socket("https://api.domain.com");
  this.websocket.on('test', data => {
    this.websocket.emit('received', {message: "Connected"})
  })
},

Консольный вывод моего Websocket:

Вывод через веб-сокет

Сетевой анализ с сайта:  Сетевой анализ


person ScarVite    schedule 19.10.2020    source источник


Ответы (1)


После долгого, я имею в виду тонны исследований, я понял, что это проблема с моей конфигурацией Apache2.

Мой API работал под портом 6606.

Проблема: Apache не хотел обновлять мой запрос WebSocket, а вместо этого просто выдал ошибку.

Если у вас такая же проблема, не забудьте заменить каждое упоминание 6606 на порт, на котором работает ваш веб-сокет

В основном мне пришлось добавить:

  RewriteEngine on
   RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
   RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
   RewriteRule .* ws://127.0.0.1:6606%{REQUEST_URI} [P]

Моя полная конфигурация Apache:

<VirtualHost *:80>
 ServerName api.domain.com
  ProxyPass / http://127.0.0.1:6606/
  ProxyPassReverse / http://127.0.0.1:6606/
</VirtualHost>

<VirtualHost *:443>
 ServerName api.domain.com
  SSLProxyEngine On
  ProxyPass / http://127.0.0.1:6606/
  ProxyPassReverse / http://127.0.0.1:6606/
  SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/api.domain.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/api.domain.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/api.domain.com/chain.pem
  RewriteEngine on
  RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
  RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
  RewriteRule .* ws://127.0.0.1:6606%{REQUEST_URI} [P]
</VirtualHost>
person ScarVite    schedule 20.10.2020