Estou criando um servidor HTTPS brutalmente simples em render.com usando Node.js, que atualiza para comunicação WebSocket. Aqui está o código:
const https = require('https');
// Create an HTTP server
const server = https.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('okay');
});
server.on('upgrade', (req, socket, head) => {
socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
'Upgrade: WebSocket\r\n' +
'Connection: Upgrade\r\n' +
'\r\n');
socket.pipe(socket); // echo back
});
// Now that server is running
server.listen(443, 'test-srv-676.onrender.com', () => {
// make a request
const options = {
port: 443,
Host: 'test-srv-676.onrender.com',
headers: {
'Connection': 'Upgrade',
'Upgrade': 'websocket',
},
};
const req = http.request(options);
req.end();
req.on('upgrade', (res, socket, upgradeHead) => {
console.log('got upgraded!');
socket.end();
});
});
Instantaneamente, recebo um erro: o servidor tenta escutar em um IP gerado a partir do domínio 'test-srv-676.onrender.com', mas está "não disponível". A configuração do meu servidor HTTPS pode estar com defeito, mas não sei. O erro lançado é:
Starting service with 'node server.js'
May 22 09:03:18 AM events.js:353
May 22 09:03:18 AM throw er; // Unhandled 'error' event
May 22 09:03:18 AM ^
May 22 09:03:18 AM
May 22 09:03:18 AM Error: listen EADDRNOTAVAIL: address not available 216.24.57.3:443
May 22 09:03:18 AM at Server.setupListenHandle [as _listen2] (net.js:1301:21)
May 22 09:03:18 AM at listenInCluster (net.js:1366:12)
May 22 09:03:18 AM at doListen (net.js:1503:7)
May 22 09:03:18 AM at processTicksAndRejections (internal/process/task_queues.js:83:21)
May 22 09:03:18 AM Emitted 'error' event on Server instance at:
May 22 09:03:18 AM at emitErrorNT (net.js:1345:8)
May 22 09:03:18 AM at processTicksAndRejections (internal/process/task_queues.js:82:21) {
May 22 09:03:18 AM code: 'EADDRNOTAVAIL',
May 22 09:03:18 AM errno: -99,
May 22 09:03:18 AM syscall: 'listen',
May 22 09:03:18 AM address: '216.24.57.3',
May 22 09:03:18 AM port: 443
May 22 09:03:18 AM }
Você só pode vincular um servidor a um endereço IP vinculado a uma interface local na máquina em que o código está sendo executado.
Nesse caso, suponho que seu provedor de hospedagem esteja usando uma forma de proxy HTTP/HTTPS em que o endereço IP para o qual o nome do host fornecido resolve é atribuído a uma máquina voltada para a Internet e, em seguida, o tráfego é encaminhado para sua máquina.
Substitua
'test-srv-676.onrender.com'
por'0.0.0.0'
para vincular a todos os endereços em sua máquina, que aceitarão conexões da máquina upstream.Provavelmente, você também desejará ouvir
http
não,https
pois parece não estar fornecendo nenhum certificado TLS localmente, portanto, espero que o proxy esteja fazendo a terminação HTTPS/TLS para você.O servidor provavelmente está usando um endereço IP flutuante que não está configurado diretamente no servidor, mas roteado para o endereço interno real do seu servidor.
Verifique o endereço IP real do seu servidor ou ligue-se
0.0.0.0
a todas as interfaces.