详解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怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何挑选优质建站一级代理提升网站排名?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  如何在IIS管理器中快速创建并配置网站?  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  简历在线制作网站免费版,如何创建个人简历?  如何在阿里云部署织梦网站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  想要更高端的建设网站,这些原则一定要坚持!  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel如何升级到最新版本?(升级指南和步骤)  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  HTML 中如何正确使用模板变量为元素的 name 属性赋值  手机网站制作与建设方案,手机网站如何建设?  高防服务器如何保障网站安全无虞?  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  深圳网站制作的公司有哪些,dido官方网站?  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  奇安信“盘古石”团队突破 iOS 26.1 提权  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel如何处理表单验证?(Requests代码示例)  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  详解阿里云nginx服务器多站点的配置  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel如何处理异常和错误?(Handler示例)  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何确保西部建站助手FTP传输的安全性?  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  php json中文编码为null的解决办法  Laravel如何集成Inertia.js与Vue/React?(安装配置)  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel安装步骤详细教程_Laravel环境搭建指南  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理