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


Posted in Javascript onJuly 04, 2017

众所周知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的七层模型:

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

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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的让textarea自适应高度的插件
Aug 03 Javascript
探讨javascript是不是面向对象的语言
Nov 21 Javascript
jQuery菜单插件用法实例
Jul 25 Javascript
javascript省市区三级联动下拉框菜单实例演示
Nov 29 Javascript
Three.js学习之Lamber材质和Phong材质
Aug 04 Javascript
vuex实现简易计数器
Oct 27 Javascript
canvas绘制多边形
Feb 24 Javascript
node.js中debug模块的简单介绍与使用
Apr 25 Javascript
详谈for循环里面的break和continue语句
Jul 20 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
Jun 29 Javascript
微信小程序实现图片上传放大预览删除代码
Jun 28 Javascript
JS实现的视频弹幕效果示例
Aug 17 Javascript
Angular 2父子组件之间共享服务通信的实现
Jul 04 #Javascript
jQuery实现动态给table赋值的方法示例
Jul 04 #jQuery
Angular 2父子组件数据传递之局部变量获取子组件其他成员
Jul 04 #Javascript
Angular 4.X开发实践中的踩坑小结
Jul 04 #Javascript
jQuery操作DOM_动力节点Java学院整理
Jul 04 #jQuery
jQuery层级选择器_动力节点节点Java学院整理
Jul 04 #jQuery
jQuery简介_动力节点Java学院整理
Jul 04 #jQuery
You might like
php中try catch捕获异常实例详解
2020/08/06 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
详解在React里使用"Vuex"
2018/04/02 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
微信小程序实现分页加载效果
2020/11/19 Javascript
Python 列表list使用介绍
2014/11/30 Python
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
python实现文本文件合并
2015/12/29 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
实习心得体会
2014/01/02 职场文书
党员培训思想汇报
2014/01/07 职场文书
幼儿园教学管理制度
2014/02/04 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
爱情保证书
2015/01/17 职场文书
个人先进事迹总结
2015/02/26 职场文书
数学备课组工作总结
2015/08/12 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
德劲DE1108畅想
2021/04/22 无线电
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python