我正在使用 Node.js 在 render.com 上创建一个极其简单的 HTTPS 服务器,该服务器升级到 WebSocket 通信。以下是代码:
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();
});
});
我立即收到错误:服务器尝试侦听从域“test-srv-676.onrender.com”生成的 IP,但“不可用”。我的 HTTPS 服务器设置可能有问题,但我不知道。抛出的错误是:
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 }
答案1
您只能将服务器绑定到与运行代码的机器上的本地接口链接的 IP 地址。
在这种情况下,我假设您的托管服务提供商正在使用一种 HTTP/HTTPS 代理形式,其中提供的主机名解析的 IP 地址被分配给面向 Internet 的机器,然后将流量转发到您的机器。
替换'test-srv-676.onrender.com'
为'0.0.0.0'
以绑定到您机器上的所有地址,然后这些地址将接受来自上游机器的连接。
您可能还想监听,http
因为https
您似乎没有在本地提供任何 TLS 证书,所以我希望代理为您执行 HTTPS/TLS 终止。
答案2
该服务器很可能使用未直接在服务器上配置的浮动 IP 地址,而是路由到服务器的实际内部地址。
检查您的服务器的实际 IP 地址或绑定0.0.0.0
到所有接口。