详解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 相关文章推荐
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
Apr 20 Javascript
基于Jquery的实现回车键Enter切换焦点
Sep 14 Javascript
javascript强大的日期函数代码分享
Sep 04 Javascript
javascript抖动元素的小例子
Oct 28 Javascript
JQuery给元素绑定click事件多次执行的解决方法
May 29 Javascript
js实现上一页下一页的效果【附代码】
Mar 10 Javascript
Angular.js回顾ng-app和ng-model使用技巧
Apr 26 Javascript
javaScript 逻辑运算符使用技巧整理
May 03 Javascript
angular4中关于表单的校验示例
Oct 16 Javascript
vue工程全局设置ajax的等待动效的方法
Feb 22 Javascript
图解javascript作用域链
May 27 Javascript
vue使用代理解决请求跨域问题详解
Jul 24 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
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
php解决约瑟夫环示例
2014/04/09 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
PHP实现简单计算器小程序
2020/08/28 PHP
onpropertypchange
2006/07/01 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
理解JS事件循环
2016/01/07 Javascript
js编写选项卡效果
2017/05/23 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
node 版本切换的实现
2020/02/02 Javascript
python获得图片base64编码示例
2014/01/16 Python
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
python快速查找算法应用实例
2014/09/26 Python
深入解析Python中的list列表及其切片和迭代操作
2016/03/13 Python
Python最小二乘法矩阵
2019/01/02 Python
python批量创建指定名称的文件夹
2019/03/21 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
杭州时比特电子有限公司SQL
2013/08/22 面试题
英语专业毕业个人求职自荐信
2013/09/21 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
社团个人总结范文
2015/03/05 职场文书
售后服务质量承诺书
2015/04/29 职场文书
党员带头倡议书
2015/04/29 职场文书