详解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实现可输入搜索文字的下拉框
Oct 23 Javascript
javascript实现时间格式输出FormatDate函数
Jan 13 Javascript
jQuery满意度星级评价插件特效代码分享
Aug 19 Javascript
JavaScript中日期的相关操作方法总结
Oct 24 Javascript
jQuery 特性操作详解及实例代码
Sep 29 Javascript
AngularJS实现在ng-Options加上index的解决方法
Nov 03 Javascript
微信小程序 开发MAP(地图)实例详解
Jun 27 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
Sep 06 Javascript
Vue中保存数据到磁盘文件的方法
Sep 06 Javascript
微信小程序实现音乐播放器
Nov 20 Javascript
JS实现秒杀倒计时特效
Jan 02 Javascript
Javascript地址引用代码实例解析
Feb 25 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基础知识:类与对象(5) static
2006/12/13 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
微信小程序button组件使用详解
2018/01/31 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
儿童学习python的一些小技巧
2018/05/27 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
Python数据可视化图实现过程详解
2020/06/12 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
迪奥美国官网:Dior美国
2019/12/07 全球购物
.NET概念性的面试题
2012/02/29 面试题
linux面试题参考答案(5)
2016/11/05 面试题
《望庐山瀑布》教学反思
2014/04/22 职场文书
新学期开学演讲稿
2014/05/24 职场文书
趣味运动会口号
2015/12/24 职场文书
初中体育课教学反思
2016/02/16 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python
mysql创建存储过程及函数详解
2021/12/04 MySQL