详解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 相关文章推荐
为数据添加append,remove功能
Oct 03 Javascript
javascript将数组插入到另一个数组中的代码
Jan 10 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
Mar 07 Javascript
关于List.ToArray()方法的效率测试
Sep 30 Javascript
详解如何较好的使用js
Dec 16 Javascript
jQuery实现立体式数字滚动条增加效果
Dec 21 Javascript
实例解析Vue.js下载方式及基本概念
May 11 Javascript
npm 更改默认全局路径以及国内镜像的方法
May 16 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
Dec 14 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
Feb 01 Javascript
Vue3.0的优化总结
Oct 16 Javascript
React如何创建组件
Jun 27 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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
重新封装zend_soap实现http连接安全认证的php代码
2011/01/12 PHP
ThinkPHP分页实例
2014/10/15 PHP
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
用console.table()调试javascript
2014/09/04 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
用Python实现协同过滤的教程
2015/04/08 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
Django中Model的使用方法教程
2018/03/07 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
python文件编写好后如何实践
2020/07/07 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
英国知名奢侈品包包品牌:Milli Millu
2016/12/22 全球购物
中职生自荐信
2013/10/13 职场文书
人事行政主管岗位职责
2013/12/22 职场文书
鲜果饮品店创业计划书
2014/01/21 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
专业见习报告范文
2014/11/03 职场文书
西柏坡导游词
2015/02/05 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
golang中的空slice案例
2021/04/27 Golang