详解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 相关文章推荐
js实现的切换面板实例代码
Jun 17 Javascript
热点新闻滚动特效的js代码
Aug 17 Javascript
原生js操作checkbox用document.getElementById实现
Oct 12 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
Sep 15 Javascript
js中unicode转码方法详解
Oct 09 Javascript
第四章之BootStrap表单与图片
Apr 25 Javascript
第一次接触神奇的Bootstrap菜单和导航
Aug 01 Javascript
基于js中的原型、继承的一些想法
Aug 10 Javascript
jquery中用jsonp实现搜索框功能
Oct 18 Javascript
详解vue模拟加载更多功能(数据追加)
Jun 23 Javascript
谈谈VUE种methods watch和compute的区别和联系
Aug 01 Javascript
微信小程序实现侧边栏分类
Oct 21 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
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
深入理解PHP中的count函数
2016/05/31 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
jQuery选择没有colspan属性的td的代码
2010/07/06 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
javascript实现yield的方法
2013/11/06 Javascript
JQuery 控制内容长度超出规定长度显示省略号
2014/05/23 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
举例讲解Python中的算数运算符的用法
2015/05/13 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
COSETTE官网:奢华,每天
2020/03/22 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
行政管理专业推荐信
2013/11/02 职场文书
财务经理岗位职责
2013/11/09 职场文书
小学运动会报道稿
2014/10/04 职场文书
杨善洲电影观后感
2015/06/04 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫