Подключение к серверу Socket.io
У меня есть веб-сайт на nextjs, и я пытаюсь реализовать функцию звонков с помощью simplepeer. Я так понимаю для этого мне нужен сигнальный сервер и я его создал на основе Socket.io. Я также арендовал облачный сервер с Ubuntu для запуска своего веб-сайта. Внутри локальной сети все работает, но при передаче на сервер подключение к серверу на Socket.io становится невозможным. У меня есть SSL сертификаты и домен (они подключены и сайт в целом доступен из глобальной сети)
Извините, но я заменил свой домен на "domain"
На арендованном сервере использую nginx и проксирование. Вот конфигурация:
server {
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name domain; # managed by Certbot
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /socket.io {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded_Proto $scheme;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
Вот конфигурация сервера сигнализации (после представленных идут просто обработчики событий):
const { Server } = require('socket.io');
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('/etc/letsencrypt/live/domain/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/domain/fullchain.pem')
};
const httpsServer = https.createServer(options);
const io = new Server(httpsServer, {
path: '/socket.io/',
cors: {
origin: '*',
methods: ['GET', 'POST'],
},
});
const PORT = process.env.PORT || 3001;
httpsServer.listen(PORT, () => {
console.log(`Socket.IO server running on port ${PORT}`);
});
И наконец, само подключение к сигнальному серверу:
useEffect(() => {
const newSocket = io('domain/socket.io/', {
transports: ['websocket'],
secure: true,
rejectUnauthorized: false,
});
setSocket(newSocket);
newSocket.on('connect', () => {
console.log('Socket.IO Connected!');
});
};
Ожидание: успешное соединение. Реальность: «Подключение WebSocket к wss://domain.ru/socket.io/?EIO=4&transport=websocket не удалось:»
Я также пробовал писать различные префиксы перед адресом подключения, например wss или https.