详解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 ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
Apr 01 Javascript
jQuery随便控制任意div隐藏的方法
Jun 28 Javascript
jQuery javaScript捕获回车事件(示例代码)
Nov 07 Javascript
AngularJS 日期格式化详解
Dec 23 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
Jun 02 Javascript
vue-cli如何快速构建vue项目
Apr 26 Javascript
单行 JS 实现移动端金钱格式的输入规则
May 22 Javascript
js脚本编写简单刷票投票系统
Jun 27 Javascript
vue 组件使用中的一些细节点
Apr 25 Javascript
一秒学会微信小程序制作table表格
Feb 14 Javascript
javascript中的闭包概念与用法实践分析
Jul 26 Javascript
Vue.js自定义指令学习使用详解
Oct 19 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 strtotime函数详解
2009/12/18 PHP
PHP连接SQLServer2005 的问题解决方法
2010/07/19 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
FLASH 广告之外的链接
2008/12/16 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
python 实现有道翻译功能
2021/02/26 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
Yahoo的PHP面试题
2014/05/26 面试题
肯尼迪就职演说稿
2013/12/31 职场文书
关于环保的建议书400字
2014/03/12 职场文书
自查自纠整改报告
2014/11/06 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
小学端午节活动总结
2015/02/11 职场文书
居委会工作总结2015
2015/05/18 职场文书