详解node如何让一个端口同时支持https与http

发布时间 - 2026-01-11 02:10:21    点击率:

众所周知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的七层模型:

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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# nodejs  # 支持https  # 支持http  # node  # NodeJS配置HTTPS服务实例分享  # 完美解决node.js中使用https请求报CERT_UNTRUSTED的问题  # nodejs实现HTTPS发起POST请求  # Node.js生成HttpStatusCode辅助类发布到npm  # Node启动https服务器的教程  # 创建一个  # 很简单  # 是一个  # 让我们  # 这也  # 很可能  # 想去  # 它可以  # 可以看出  # 这篇文章  # 高性能  # 转换成  # 很方便  # 众所周知  # 在工作中  # 解决这个问题  # 大家多多  # 就可以  # 七层  # 客户端 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  jquery插件bootstrapValidator表单验证详解  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  如何在IIS管理器中快速创建并配置网站?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  JavaScript如何实现继承_有哪些常用方法  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Android中AutoCompleteTextView自动提示  音响网站制作视频教程,隆霸音响官方网站?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel如何自定义分页视图?(Pagination示例)  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何在阿里云部署织梦网站?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  网站制作免费,什么网站能看正片电影?  html5的keygen标签为什么废弃_替代方案说明【解答】  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何快速完成中国万网建站详细流程?  网站制作企业,网站的banner和导航栏是指什么?  香港服务器WordPress建站指南:SEO优化与高效部署策略  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  如何用狗爹虚拟主机快速搭建网站?  如何在自有机房高效搭建专业网站?  教你用AI润色文章,让你的文字表达更专业  如何在建站宝盒中设置产品搜索功能?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  黑客入侵网站服务器的常见手法有哪些?  移动端脚本框架Hammer.js  Python面向对象测试方法_mock解析【教程】  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  如何在Windows服务器上快速搭建网站?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  Linux网络带宽限制_tc配置实践解析【教程】  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能