详解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门面的加密与解密功能

