frp 是一款使用 Go 编写的高性能反向代理应用,专注于内网穿透,支持 TCP、UDP、HTTP、HTTPS 等协议。只需在公网机器运行 frps、内网机器运行 frpc,编写简单的 TOML 配置,即可把内网服务安全地暴露到公网。本文聚焦配置实践,不涉及源码与扩展开发。
frp 的组成frp 由两部分组成:
frps:部署在拥有公网 IP 的服务器上,负责接收并转发公网请求。
frpc:部署在需要被访问的内网机器上,主动与 frps 建立连接。
公网用户访问 frps 的某个端口时,frps 会把流量沿 frpc 建立的隧道转发到内网服务的实际端口。
安装frp 跨平台,下载对应平台的二进制包即可,无需额外依赖。
确认系统架构下载前先确认主机的 CPU 架构,避免下错版本:
12# Linux / macOSuname -m
12# Windows PowerShell$env:PROCESSOR_ARCHITECTURE
常见输出与对应的发行包:
输出
架构
frp 发行包名中的标识
x86_64 / AMD64
64 位 Intel / ...
fail2ban 是一款用 Python 编写的入侵防御软件。它通过扫描日志文件(如 /var/log/auth.log)识别多次认证失败的 IP,然后动态更新防火墙规则(如 iptables、nftables)来临时或永久封禁该 IP,有效对抗暴力破解和恶意扫描。当前版本 v1.1.x。
工作原理fail2ban 由三个核心概念组成:
Jail(监狱):一组规则单元,包含一个 Filter 和一个或多个 Action。
Filter(过滤器):用正则表达式从日志中提取失败尝试和 IP 地址。
Action(动作):定义封禁(ban)与解封(unban)时要执行的命令,如修改 iptables 规则或发送邮件告警。
工作流程:日志文件 → Filter 匹配 → 计数(findtime 内 maxretry 次) → Action 封禁(bantime 时长) → 到期后自动解封。
安装fail2ban 已包含在大多数 Linux 发行版仓库中,按发行版选择对应命令:
1234567891011121314151617181920212223# Debian / Ubuntus ...
JavaScript
未读
在 JavaScript 的 forEach 循环中处理异步操作(如接口请求)时,可能会遇到一些问题,因为 forEach 本身不会等待回调函数中的异步操作完成,就会继续同步执行下一个迭代。
问题分析12345const array = ['a1', 'a2', 'a3'];array.forEach(async (item) => { await fetchData(item); // 异步操作不会按预期等待});console.log('Done'); // 这会在所有异步操作完成之前就执行
所有请求会并行触发,但 forEach 不会等待它们完成。
若希望顺序执行请求(一个接一个),forEach 无法实现。
若希望等待所有请求完成后再处理结果,forEach 无法直接实现。
解决方案使用 for...of 循环(顺序执行)for...of循环会等待异步操作完成,因为它是在循环体内部使用await,这样可以按顺序执行每个异步操作。
1234567async fun ...
Node.js 是构建高性能、可扩展网络应用程序的强大工具,它使用 JavaScript 语言进行开发,并基于 Google Chrome 的 V8 引擎运行。随着前端技术的发展,越来越多的开发者开始关注如何在后端应用中有效使用 JavaScript,而 Node.js 正是满足这一需求的核心技术之一。本文将详细介绍 Node.js 的概念、应用场景、核心特性以及实际开发中的一些常见用法,帮助开发者全面了解和掌握这门技术。
Node.js 概述Node.js 简介Node.js 是一个基于事件驱动、非阻塞 I/O 模型的 JavaScript 运行时环境,旨在使开发者能够用 JavaScript 编写后端代码。与传统的多线程模型不同,Node.js 采用了单线程事件循环(event loop),通过异步 I/O 操作来处理并发任务,从而提升应用的性能。由于它的高效性和扩展性,Node.js 广泛应用于构建网络服务器、API 接口和微服务等场景。
事件驱动和非阻塞 I/ONode.js 的最大特点之一是其基于事件驱动和非阻塞 I/O 的架构。这 ...
Node.js 是一种基于 Chrome V8 引擎构建的 JavaScript 运行环境。它不仅允许开发者在服务端运行 JavaScript,还提供了强大的模块系统,极大地提升了代码的组织性和可重用性。本文将详细介绍 Node.js 中的模块化机制,包括模块的创建、导入、导出,以及模块缓存等内容。
Node.js 模块化概述模块化的意义模块化是一种将代码分割成独立部分的开发模式,每个模块负责特定的功能。通过模块化,开发者可以提高代码的可读性、可维护性和复用性。在 Node.js 中,模块化是其核心特性之一。Node.js 使用的模块系统基于 CommonJS 规范,它允许开发者在应用中引入外部代码,并封装自身功能。
CommonJS 规范介绍Node.js 中的模块化依赖于 CommonJS 规范,该规范定义了模块的导出和引入方式。以下是 CommonJS 规范的几个核心概念:
模块:一个文件就是一个模块。
require 函数:用于引入其他模块。
module.exports:用于导出当前模块的内容。
模块的类型Node.js 提供了三种主要的模块类型:
核心模块:由 N ...
CommonJS 模块化规范是 Node.js 中默认的模块系统,它为服务器端 JavaScript 提供了一种结构化和模块化的开发方式。通过 CommonJS 规范,开发者可以将代码分成不同的模块,并且轻松地进行加载和使用。本文将详细介绍 CommonJS 模块化规范的核心概念、用法以及与 ES Modules 的区别。
CommonJS 模块化概述什么是 CommonJS?CommonJS 是一套为 JavaScript 提供模块化支持的规范,它最初的目标是为服务器端 JavaScript 提供模块化机制。Node.js 采用了 CommonJS 作为其模块系统的基础,帮助开发者更好地组织代码,避免命名冲突,同时支持模块重用。
CommonJS 的特点CommonJS 模块化有以下几个显著特点:
同步加载 :CommonJS 模块是同步加载的,意味着在服务器端执行时,模块会在代码执行时立即加载。
单例模式 :每个模块在第一次加载后会被缓存,后续的加载将直接返回缓存中的实例。
模块导出 :使用 module.exports 或 exports 将模块的内容暴露给外部使用。
模块 ...
Node.js 是一个强大的 JavaScript 运行环境,广泛应用于服务器端开发。它采用模块化结构,允许开发者组织代码并有效地管理依赖。本文将详细介绍 Node.js 中模块的分类以及 require 函数的使用,帮助你更好地理解模块系统并在实际项目中加以运用。
Node.js 模块概述模块的定义模块是 Node.js 中组织代码的基本单位,类似于传统编程语言中的库或包。通过模块,开发者可以将功能代码拆分成独立的文件,以便复用和维护。Node.js 自带模块系统,开发者可以使用内置模块、第三方模块或自定义模块来实现不同的功能。
模块的作用模块化可以显著提高代码的可读性和可维护性。通过将复杂应用拆解成多个功能模块,开发者能够减少代码冗余,提升项目的可扩展性。在 Node.js 中,模块化使得开发者能够轻松管理依赖、共享功能代码,并且避免全局变量污染。
Node.js 模块的分类核心模块Node.js 核心模块是由 Node.js 官方提供的,内置在运行时环境中。它们无需安装,可以直接通过 require 函数引入并使用。常见的核心模块包括:
fs:文件系统模块,提供文件读写操作 ...
Node.js 是一个基于 JavaScript 的运行环境,支持服务端开发。其模块系统是构建复杂应用程序的核心功能之一。本文将详细介绍 Node.js 中的模块加载机制,帮助开发者更好地理解其工作原理,优化应用的模块管理。
模块加载机制概述模块的定义在 Node.js 中,模块是封装功能的基本单元,每个 JavaScript 文件都是一个独立的模块。通过模块化,开发者可以将复杂的功能分解成更小的组件,使代码更加可读、可维护。
Node.js 的模块系统基于 CommonJS 规范,与前端常用的 ES6 模块系统不同。CommonJS 模块主要通过 require() 函数来引入,使用 module.exports 导出模块的功能。
模块类型Node.js 支持多种类型的模块加载:
核心模块 :Node.js 自带的模块,如 fs、http 等,无需安装,可以直接使用。
文件模块 :用户自定义的模块,以 JavaScript 文件的形式存在,可以通过 require() 加载。
第三方模块 :通过 npm 安装的外部库,需要在项目中安装后加载。
模块的加载过程Node.js 的 ...
Node.js 是构建服务器端应用的强大平台,其模块化系统极大地方便了代码的组织和复用。在 Node.js 中,每个文件都是一个模块,它有自己的作用域和 module 对象。本文将详细介绍 Node.js 中的模块作用域及 module 对象的使用,帮助开发者更好地理解和运用模块化系统。
模块作用域概述模块作用域的定义在 Node.js 中,每个文件都被视为一个独立的模块,并拥有自己的模块作用域 。这意味着在一个模块中定义的变量、函数或类是私有的 ,无法被其他模块直接访问。这种作用域的隔离性确保了模块之间的互不干扰,避免了全局变量的污染。
123456// file1.jslet name = 'Peigen';function greet() { console.log(`Hello, ${name}`);}
在上述例子中,name 和 greet 变量只在 file1.js 中可见,其他模块无法直接访问它们。
模块作用域的特性
私有性 :模块中的任何变量或函数默认都是私有的,不会泄露到全局作用域。
独立性 :每个模 ...
Node.js 是一款基于 JavaScript 的服务端开发框架,其中内置的 fs 文件系统模块为开发者提供了强大的文件处理能力。本文将详细介绍 Node.js 的 fs 模块,帮助你更好地理解文件操作的各种方式和方法,掌握如何使用该模块处理文件和目录。
fs 模块概述模块介绍fs(File System)模块是 Node.js 内置的核心模块之一,提供了文件读写、目录管理等一系列与文件系统相关的 API。通过 fs 模块,开发者可以在不引入外部依赖的情况下,进行文件操作、流操作等。
该模块包含的 API 主要分为同步和异步两类,异步 API 更加适合大规模 I/O 密集型操作,因为它不会阻塞主线程,而同步 API 更适合处理简单的文件操作或需要按顺序执行的操作。
fs 模块的加载在使用 fs 模块之前,首先需要通过 require 关键字将其引入:
1const fs = require('fs');
此操作后,你便可以使用 fs 提供的所有功能。
文件操作读取文件文件读取是 fs 模块的常见功能之一,开发者可以使用 fs.readFile 和 ...

