详解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无缝向上滚动实现代码
Mar 29 Javascript
关于JS管理作用域的问题
Apr 10 Javascript
JS实现按钮添加背景音乐示例代码
Oct 17 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
Dec 08 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
Dec 11 Javascript
JS实现留言板功能[楼层效果展示]
Dec 27 Javascript
JS中双击和单击事件冲突的解决方法
Apr 09 Javascript
vue.js实现的经典计算器/科学计算器功能示例
Jul 11 Javascript
详解nuxt路由鉴权(express模板)
Nov 21 Javascript
基于Node的Axure文件在线预览的实现代码
Aug 28 Javascript
微信小程序3D轮播实现代码
Sep 19 Javascript
在vue中使用vant TreeSelect分类选择组件操作
Nov 02 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下的原生ajax请求用法实例分析
2020/02/28 PHP
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
2019/09/24 Javascript
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
python函数的5种参数详解
2017/02/24 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
python django中8000端口被占用的解决
2019/12/17 Python
Python JSON编解码方式原理详解
2020/01/20 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
django-csrf使用和禁用方式
2020/03/13 Python
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
MySQL面试题目集锦
2016/04/14 面试题
销售文员岗位职责
2013/11/29 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
解除施工合同协议书
2014/10/17 职场文书
先进单位申报材料
2014/12/25 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书