【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战

简介: 【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战

@[toc]

多进程

Js以单线程模式运行,但它使用事件驱动来处理并发,这有助于我们在多核cpu系统上创建多个子进程,从而提高性能。

const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);
 
   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });
 
   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });
 
   workerProcess.on('close', function (code) {
      console.log('子进程已退出,退出码 '+code);
   });
}

每个子进程始终有三个流对象:子stdin、子。标准输出和子标准错误它们可以共享父进程的stdio流,也可以是独立的分流流对象。
节点提供子进程_进程模块用于创建子进程。方法如下:

child_process.exec(command[, options], callback)

exec-child_进程。Exec使用子进程执行命令,缓存子进程的输出,并以回调函数参数的形式返回子进程的结果。
派生子进程。Spawn使用指定的命令行参数创建新进程。
fork-child进程。Fork是一种特殊形式的派生(),用于在子进程中运行的模块。例如,fork('./son.js')相当于派生('node',['./sonjs'])。与派生方法不同,fork将在父进程和子进程之间建立通信管道,用于进程之间的通信。

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
    var workerProcess = child_process.exec('node support.js '+i, function (error, stdout, stderr) {
        if (error) {
            console.log(error.stack);
            console.log('Error code: '+error.code);
            console.log('Signal received: '+error.signal);
        }
        console.log('stdout: ' + stdout);
        console.log('stderr: ' + stderr);
    });
 
    workerProcess.on('exit', function (code) {
        console.log('子进程已退出,退出码 '+code);
    });
}

常用工具

util.callbackify(original)将异步异步函数(或返回值为Promise的函数)转换为遵循异常优先回调样式的函数,例如,将(err,value)=>…callback作为最后一个参数。在回调函数中,第一个参数是拒绝的原因(如果Promise被解析为null),第二个参数是要解析的值。

const util = require('util');

async function fn() {
  return 'hello world';
}
const callbackFunction = util.callbackify(fn);

callbackFunction((err, ret) => {
  if (err) throw err;
  console.log(ret);
});

回调函数异步执行,并具有异常堆栈错误跟踪。如果回调函数引发异常,则进程将触发“uncaughtException”异常。如果未捕获,则进程将退出。
Null作为回调函数中的参数具有特殊意义。如果回调函数的第一个参数是promise拒绝的原因,并且具有返回值,并且该值可以转换为布尔值false,则该值将封装在Error对象中,并且可以通过属性reason获得。

function fn() {
  return Promise.reject(null);
}
const callbackFunction = util.callbackify(fn);

callbackFunction((err, ret) => {
  err && err.hasOwnProperty('reason') && err.reason === null;  // true
});

当 Promise 被以 null 拒绝时,它被包装为 Error 并且原始值存储在 reason 中。
我们定义了一个基本对象base和从base继承的子对象。Base有三个在构造函数中定义的属性,原型中定义的一个函数inherits实现继承。操作结果如下:

base 
Hello base 
{ name: 'base', base: 1991, sayHello: [Function] } 
sub 
{ name: 'sub' }

Sub只继承Base在原型中定义的函数,而在构造函数中创建的Base属性和sayHello函数不被Sub继承。
同时,原型中定义的属性将不会被合并。日志将作为对象的属性输出。如果我们删除objSub sayHello();该行中的注释将显示:

var util = require('util'); 
function Person() { 
    this.name = 'byvoid'; 
    this.toString = function() { 
    return this.name; 
    }; 
} 
var obj = new Person(); 
console.log(util.inspect(obj)); 
console.log(util.inspect(obj, true)); 

'keylog' 事件

当此代理管理的连接生成或接收密钥材料时(通常在握手完成之前,但不一定),将触发密钥日志事件。此密钥材料可以存储用于调试,因为它允许解密捕获的TLS流量。它可以为每个套接字触发多次。
如果我们编写一段js代码并在浏览器中运行,我们就是在进行前端开发。
若我们编写一段js代码并在node中运行它,我们就是在进行后端开发。在这里插入图片描述
作为JavaScript运行环境,node。js提供了基本的函数和API:(许多框架都是从node.js派生的)
Express框架(快速构建web应用程序)
Electron框架(快速构建跨平台桌面应用程序)
Restify框架(快速构建API接口项目)
读写数据库,创建实用的命令行工具以帮助前端开发

TLS/SSL

tls模块使用OpenSSL提供传输层安全性(tls)和安全套接字层(SSL):加密流通信。
TLS/SSL是一种公钥/私钥基础设施。每个客户端和服务器都需要一个私钥。创建私钥的方法如下:

openssl genrsa -out ryans-key.pem 2048
openssl pkcs12 -export -in agent5-cert.pem -inkey agent5-key.pem \
    -certfile ca-cert.pem -out agent5.pfx

TLS协议允许客户端协商TLS会话的某些方法内容。然而,会话协商需要服务器响应的资源。这使其成为拒绝服务攻击的潜在媒介。

var ciphers = tls.getCiphers();
console.log(ciphers); // ['AES128-SHA', 'AES256-SHA', ...]

“正向保密”或“完全正向保密-完全正向保密”协议描述了密钥协商(如密钥交换)方法的特点。事实上,这意味着即使服务器的密钥是危险的,通信也只能被一类人窃听,他们必须尝试获取为每个会话生成的密钥对。
通过在每次握手期间随机生成用于密钥协商的密钥对(而不是针对所有会话使用一个密钥)来实现完全前向保密。实现这项技术(提供完全前向保密)的方法被称为“短暂”。

var tls = require('tls');
var fs = require('fs');

var options = {
  key: fs.readFileSync('server-key.pem'),
  cert: fs.readFileSync('server-cert.pem'),

  // This is necessary only if using the client certificate authentication.
  requestCert: true,

  // This is necessary only if the client uses the self-signed certificate.
  ca: [ fs.readFileSync('client-cert.pem') ]
};

var server = tls.createServer(options, function(socket) {
  console.log('server connected',
              socket.authorized ? 'authorized' : 'unauthorized');
  socket.write("welcome!\n");
  socket.setEncoding('utf8');
  socket.pipe(socket);
});
server.listen(8000, function() {
  console.log('server bound');
});
相关文章
|
5月前
|
缓存 NoSQL Unix
【实战指南】守护进程服务实现
本文介绍了在Linux系统中实现守护进程异常重启的几种方案。通过理解僵死进程和信号处理机制,提出了基于SIGCHLD信号监听、轮询proc文件系统及waitpid接口的三种方法,并给出了C++实现代码。最终选择轮询方式以提升稳定性,确保服务进程在崩溃后能自动重启,保障系统可靠性。
323 59
|
6月前
|
机器学习/深度学习 Kubernetes 监控
Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
本文深入探讨了Kubernetes节点故障自愈方案,结合Node Problem Detector(NPD)与自动化脚本,提供技术细节、完整代码示例及实战验证。文章分析了硬件、系统和内核层面的典型故障场景,指出现有监控体系的局限性,并提出基于NPD的实时事件捕获与自动化诊断树的改进方案。通过深度集成NPD、设计自动化修复引擎以及展示内核死锁恢复的实战案例,文章详细说明了自愈流程的实现步骤与性能优势。此外,还提供了生产环境部署指南、高可用架构设计及安全防护措施,并展望了机器学习增强故障预测和混沌工程验证的进阶优化方向。全文约1.2万字,适合希望提升Kubernetes集群稳定性的技术人员阅读。
370 1
|
缓存 JavaScript Unix
Node.js 多进程
10月更文挑战第8天
155 0
|
9月前
|
运维 安全 网络安全
【运维实战分享】轻松搞定 SSL 证书管理,告别证书繁琐操作
Spug证书平台的最大亮点之一就是其极为简化的证书申请流程,无论是新手还是经验丰富的运维专家,都可以在几分钟内轻松完成证书的申请,通过微信扫码直接登录申请,无需复杂注册,整个过程既方便又快捷。
234 17
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
753 15
在 golang 中执行 javascript 代码的方案详解
|
安全 数据建模 网络安全
如何精准选择SSL证书:基于实战经验的深度指南
在数字时代,数据安全为企业生存之基石。本文由网络安全专家执笔,详述SSL证书于安全传输层构建之重要性。从理解SSL证书基础入手,解析不同类型证书适用场景,并强调选择知名证书颁发机构与规划续费策略之必要。进而深入分析选择要点,包括兼容性、性能考量及用户体验提升,辅以实操建议与案例分析,助您在保障安全同时平衡成本效益。安全无小事,为网站披上SSL证书,使数据传输更安心。
289 65
|
12月前
|
安全 应用服务中间件 网络安全
实战经验分享:利用免费SSL证书构建安全可靠的Web应用
本文分享了利用免费SSL证书构建安全Web应用的实战经验,涵盖选择合适的证书颁发机构、申请与获取证书、配置Web服务器、优化安全性及实际案例。帮助开发者提升应用安全性,增强用户信任。
|
存储 网络架构
Next.js 实战 (四):i18n 国际化的最优方案实践
这篇文章介绍了Next.js国际化方案,作者对比了网上常见的方案并提出了自己的需求:不破坏应用程序的目录结构和路由。文章推荐使用next-intl库来实现国际化,并提供了详细的安装步骤和代码示例。作者实现了国际化切换时不改变路由,并把当前语言的key存储到浏览器cookie中,使得刷新浏览器后语言不会失效。最后,文章总结了这种国际化方案的优势,并提供Github仓库链接供读者参考。
746 0
Next.js 实战 (四):i18n 国际化的最优方案实践
|
运维 JavaScript jenkins
鸿蒙5.0版开发:分析CppCrash(进程崩溃)
在HarmonyOS 5.0中,CppCrash指C/C++运行时崩溃,常见原因包括空指针、数组越界等。系统提供基于posix信号机制的异常检测能力,生成详细日志辅助定位。本文详解CppCrash分析方法,涵盖异常检测、问题定位思路及案例分析。
472 4
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
547 4