详解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 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 Javascript
jquery trim() 功能源代码
Feb 14 Javascript
js如何判断不同系统的浏览器类型
Oct 28 Javascript
jquery导航制件jquery鼠标经过变色效果示例
Dec 05 Javascript
window.returnValue使用方法示例介绍
Jul 03 Javascript
简单谈谈node.js 版本控制 nvm和 n
Oct 15 Javascript
JS实现物体带缓冲的间歇运动效果示例
Dec 22 Javascript
slideToggle+slideup实现手机端折叠菜单效果
May 25 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
Jul 20 Javascript
使用JavaScript实现链表的数据结构的代码
Aug 02 Javascript
基于layui的table插件进行复选框联动功能的实现方法
Sep 19 Javascript
js实现文章目录索引导航(table of content)
May 10 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
正则表达式语法
2006/10/09 Javascript
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
python中列表和元组的区别
2017/12/18 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
python操作toml文件的示例代码
2020/11/27 Python
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
哈曼俄罗斯官方网上商店:Harman.club
2020/07/24 全球购物
招商业务员岗位职责
2013/12/16 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript