详解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 相关文章推荐
再谈javascript 动态添加样式规则 W3C校检
Dec 25 Javascript
JS模拟自动点击的简单实例
Aug 08 Javascript
JavaScript动态修改弹出窗口大小的方法
Apr 06 Javascript
JS实现DIV容器赋值的方法
Dec 14 Javascript
js+html5实现页面可刷新的倒计时效果
Jul 15 Javascript
基于vue-resource jsonp跨域问题的解决方法
Feb 03 Javascript
Vue+Express实现登录注销功能的实例代码
May 05 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
Sep 05 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
Sep 21 Javascript
JQuery获得内容和属性方法解析
May 30 jQuery
Vue循环遍历选项赋值到对应控件的实现方法
Jun 22 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
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
如何快速的呈现我们的网页的技巧整理
2007/07/01 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
nodeJs爬虫获取数据简单实现代码
2016/03/29 NodeJs
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
2017/05/13 NodeJs
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
大学生创业计划书的格式要求
2013/12/29 职场文书
幼儿园教师备课制度
2014/01/12 职场文书
四查四看整改措施
2014/09/19 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书