绑定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; };