详解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环境变量使用与安全管理

