node如何让一个端口同时支持https与http

众所周知node是一个高性能的web服务器,使用它可以很简单的创建一个http或https的服务器。
比如一个很简单的http服务器:

var http = require('http');
var https = require('https');

var httpPort = 3345;

var server = http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('hello world!');
}).listen(httpPort);

https服务器需要生成证书,详情请看这篇文章:HTTPS 的原理和 NodeJS 的实现。这里我们直接看最终成果,证书文件在本文附件中。

var https = require('https');
var fs = require('fs');

var httpsPort = 3346;

var options = {
  key: fs.readFileSync('./cakey.pem'),
  cert: fs.readFileSync('./cacert.pem')
};

var sserver = https.createServer(options, function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('secured hello world');
}).listen(httpsPort);

从上文我们可以看出,node生成的每个服务器必须分配一个端口。那么如果我们在工作中遇到一个需求:让同一个端口或地址既支持http协议又支持https协议,这时候我们该怎么办,有的同学很可能想到用nginx做反向代理,这不失为一个解决方案,但这也同样意味着增加了产品的复杂度,用户并不想去折腾ngnix。
办法是有的,原理就要搬出OSI的七层模型:

HTTP与HTTPS都属于应用层协议,所以只要我们在底层协议中进行反向代理,就可以解决这个问题! 刚好node可以让我们很方便的创建一个tcp服务器!

所以我们的核心代码如下:

var net = require('net');
var http = require('http');
var https = require('https');
var fs = require('fs');

var httpPort = 3345;
var httpsPort = 3346;

var server = http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('hello world!');
}).listen(httpPort);

var options = {
  key: fs.readFileSync('./cakey.pem'),
  cert: fs.readFileSync('./cacert.pem')
};

var sserver = https.createServer(options, function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('secured hello world');
}).listen(httpsPort);

net.createServer(function(socket){
    socket.once('data', function(buf){
        console.log(buf[0]);
        // https数据流的第一位是十六进制“16”,转换成十进制就是22
        var address = buf[0] === 22 ? httpsPort : httpPort;
        //创建一个指向https或http服务器的链接
        var proxy = net.createConnection(address, function() {
            proxy.write(buf);
            //反向代理的过程,tcp接受的数据交给代理链接,代理链接服务器端返回数据交由socket返回给客户端
            socket.pipe(proxy).pipe(socket);
        });

        proxy.on('error', function(err) {
            console.log(err);
        });
    });

    socket.on('error', function(err) {
        console.log(err);
    });
}).listen(3344);
时间: 2024-09-14 08:59:13

node如何让一个端口同时支持https与http的相关文章

server-nginx如何配置让一个域名同时支持http和https?

问题描述 nginx如何配置让一个域名同时支持http和https? 百度搜索了很多答案,都是说在一个server里开启 listen 80; listen 443 ssl 关闭ssl on 配置ssl_certificate和ssl_certificate_key 但试了之后都没用 配置https访问我会,配置之后https可以访问,但是http访问显示400错误,访问不了.现在的问题是要配置同时支持http和https 另外怎么冲c币?目前c币不够啊 解决方案 Nginx服务器配置对http

nginx如何配置让一个域名同时支持http和https?

问题描述 nginx如何配置让一个域名同时支持http和https? 百度搜索了很多答案,都是说在一个server里开启 listen 80; listen 443 ssl 关闭ssl on 配置ssl_certificate和ssl_certificate_key 但试了之后都没用 解决方案 Nginx服务器配置对https的支持Nginx支持http文件上传的配置 解决方案二: @Robot-N,配置https访问我会,配置之后https可以访问,但是http访问显示400错误,访问不了.现

在 Tomcat 中配置 SSL/TLS 以支持 HTTPS

本件详细介绍了如何通过几个简单步骤在 Tomcat 中配置 SSL/TLS .使用 JDK 生成自签名的证书,最终实现在应用中支持 HTTPS 协议. 生产密钥和证书 Tomcat 目前只能操作 JKS.PKCS11.PKCS12 格式的密钥存储库.JKS 是 Java 标准的"Java 密钥存储库"格式,是通过 keytool 命令行工具创建的.该工具包含在 JDK 中.PKCS12 格式一种互联网标准,可以通过 OpenSSL 和 Microsoft 的 Key-Manager 来

能否同时支持https单双认证

问题描述 https默认开启端口443,应用端口另外开,如果现在应用端口只能开启80,容器能否同时支持单双认证?我们开发用tomcat上线用websphere 解决方案 一个端口做单向认证,另外一个做双向认证是可以的:一个端口做单双认证就不知道了

求两个软件同时监听一个端口的方法

问题描述 硬件:酒店的身份证阅读器,USB接口说明:现在有一酒店软件,可以正常刷卡读取身份证.我要另外做一个小软件,监听身份证阅读器,当这套酒店软件刷身份证的时候,我的软件能感应到有刷卡动作就行了.现在难题是,酒店软件已经占用了身份证阅读器,两个软件不能同时占用一个端口.求各位大神有没有什么好的解决办法呢 解决方案 解决方案二:无解那东西即使是USB接口也USB转COM的同一时间只能有一个程序监听端口还是从软件上下工夫吧如果那个酒店软件不是你自己的那就考虑下注入吧类似于网游外挂那种方式不过那属于

使用Node.js实现一个简单的FastCGI服务器实例_node.js

本文是我最近对Node.js学习过程中产生的一个想法,提出来和大家一起探讨. Node.js的HTTP服务器 使用Node.js可以非常容易的实现一个http服务,最简的例子如官方网站的示例: 复制代码 代码如下: var http = require('http');http.createServer(function (req, res) {    res.writeHead(200, {'Content-Type': 'text/plain'});    res.end('Hello Wo

node js-php应用80端口,使用node.js通过8888端口实现即时推送,怎么解决跨域问题?

问题描述 php应用80端口,使用node.js通过8888端口实现即时推送,怎么解决跨域问题? 项目背景是一个php应用.为了加入即时推送功能,使用node.js写了8888端口用于推送即时消息,并使用socket.io进行数据传输. 如何解决80端口应用页面跨域与8888端口建立socket连接问题?

iOS10 适配 ATS(app支持https通过App Store审核) 韩俊强的博客

一. HTTPS 其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的安全:而对于接收端,在SSL/TSL将接收的数据包解密之后,将数据传给HTTP协议层,就是普通的HTTP数据.HTTP和SSL/TSL都处于OSI模型的应用层.从HTTP切换到HTTPS是一个非常简单的过程,在做具体的切换操作之前,我们需要了解几个概念: SSL/TLS 为了保证这些隐私数据能加密传

Ubuntu安装Docker引擎和支持HTTPS的docker-registry服务

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1729858 虽然本文标题是针对Ubuntu的,但对于CentOS也是可以变通的,无非是几个命令不完全相同,有经验的人可以自行修改,部分不容易找的包或者命令已经在文档中作出了注释,可以作为参考. 目录导航: 安装Docker引擎服务 安装docker-enter工具,便于使用docker 安装docker-regis