详解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打造支持汉字,拼音,英文快速定位查询的超级select插件
Jun 18 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
Oct 15 Javascript
js数组去重的常用方法总结
Jan 24 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
Mar 24 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
Dec 14 Javascript
Webpack中css-loader和less-loader的使用教程
Apr 27 Javascript
Node.js Express安装与使用教程
May 11 Javascript
BootStrap table实现表格行拖拽效果
Dec 01 Javascript
seajs和requirejs模块化简单案例分析
Aug 26 Javascript
Vue 3.0双向绑定原理的实现方法
Oct 23 Javascript
JavaScript利用键盘码控制div移动
Mar 19 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
Apr 20 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
使用无限生命期Session的方法
2006/10/09 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
2016/07/21 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
vue实现简单的日历效果
2020/09/24 Javascript
vue实现的封装全局filter并统一管理操作示例
2020/02/02 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
vue-video-player 断点续播的实现
2021/02/01 Vue.js
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
详解Python中的静态方法与类成员方法
2017/02/28 Python
python模糊图片过滤的方法
2018/12/14 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
python实现中文文本分句的例子
2019/07/15 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
毕业生找工作的自我评价
2013/10/18 职场文书
绩效工资实施方案
2014/03/15 职场文书
业务员自荐信范文
2014/04/20 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
还款承诺书范本
2015/01/20 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技