绑定node.js中的SAME端口上的HTTP和HTTPSstream量?
我有一个场景,我的node.js应用程序位于负载平衡HAProxy的后面,该HAProxy正在将HTTP和HTTPSstream量转发到我的节点服务器上的端口8000。
不幸的是,这让我陷入了一个棘手的问题:我需要为我的http和https服务器使用相同的端口。 如果在某种程度上更容易,我也会满意只是将httpredirect到https。
但是,现在,我处于一个我被迫selectHTTP – 或 – HTTPS的位置
为了包含代码…
https.createServer(api.credentials, api.server).listen(8000); http.createServer(api.server).listen(8000); // ERR ADDR IN USE
你不能让两个任务在同一个端口上侦听。 HTTP侦听默认端口80,HTTPS侦听默认端口443.您将要pipe理您的HAProxy程序以进行相应的转发。
我发现这个漂亮的页面 ,build议你像这样设置你的configuration:
全球 统计套接字./haproxy.stats级别admin 前端ft_http 绑定:80 模式http default_backend bk_http 前端ft_https 绑定:443 模式tcp default_backend bk_https 后端bk_http 模式http 平衡roundrobin 坚持在src表bk_https 默认服务器间1s 服务器s1 192.168.1.1:80检查ID 1 服务器s2 192.168.1.2:80检查ID 2 后端bk_https 模式tcp 平衡roundrobin stick-table type ip size 200k expire 30m 坚持在src 默认服务器间1s 服务器s1 192.168.1.1:443检查ID 1 服务器s2 192.168.1.2:443检查ID 2
注意上面的configuration如何将Node.js端口设置为80和443.由于Node.js没有pipe理员权限,因此您可能希望编辑端口以像这样工作:
后端bk_http 模式http 平衡roundrobin 坚持在src表bk_https 默认服务器间1s 服务器s1 192.168.1.1:8000检查ID 1 服务器s2 192.168.1.2:8000检查ID 2 后端bk_https 模式tcp 平衡roundrobin stick-table type ip size 200k expire 30m 坚持在src 默认服务器间1s 服务器s1 192.168.1.1:8001检查ID 1 服务器s2 192.168.1.2:8001检查ID 2
你也想要改变你的Node.js代码:
https.createServer(api.credentials,api.server).listen(8001); http.createServer(api.server)。听(8000);
我不熟悉HAProxy,所以我可能会closures。
您不能将多个服务器绑定到相同的端口,但可以打开一个TCP服务器并将stream量代理到相关的HTTP实现。
httpx.js
'use strict'; let net = require('net'); let http = require('http'); let https = require('https'); exports.createServer = (opts, handler) => { let server = net.createServer(socket => { socket.once('data', buffer => { // Pause the socket socket.pause(); // Determine if this is an HTTP(s) request let byte = buffer[0]; let protocol; if (byte === 22) { protocol = 'https'; } else if (32 < byte && byte < 127) { protocol = 'http'; } let proxy = server[protocol]; if (proxy) { // Push the buffer back onto the front of the data stream socket.unshift(buffer); // Emit the socket to the HTTP(s) server proxy.emit('connection', socket); } // Resume the socket data stream socket.resume(); }); }); server.http = http.createServer(handler); server.https = https.createServer(opts, handler); return server; };