云计算百科
云计算领域专业知识百科平台

Node.js 服务器运行逻辑 / Nginx原理详解

Node.js 是一个强大的服务器端 JavaScript 运行环境,广泛用于构建高效的 Web 服务。本文将用最通俗的语言,详细讲解 Node.js 的单线程机制、事件循环、Nginx 反向代理、同步与异步、宏任务与微任务、线程与协程等核心概念。

1. Node.js 的运行逻辑:单线程的“超级忙碌收银员”

1.1 什么是 Node.js?

知识点 :

定义 :Node.js 是一个让 JavaScript 运行在服务器上的工具。平时 JavaScript 跑在浏览器里(处理网页交互,如按钮点击),而 Node.js 让 JavaScript 能干服务器的事,比如处理用户请求、读写文件、搭建网站后台。

核心特点 :

  • 单线程 :Node.js 只有一个主线程,像一个超级忙碌的收银员,一次只处理一个任务,但效率极高。
  • 异步驱动 :慢任务(像访问网络、读文件)不会让主线程卡住,Node.js 把这些任务交给“后台帮手”,自己继续处理其他请求。
  • 轻量高效 :Node.js 占用内存少,适合实时应用(像聊天室、网页服务器)。

为什么用 Node.js ?

  • 简单 :前端开发者熟悉 JavaScript,写服务器代码容易上手。
  • 高效 :能快速处理大量请求,适合高并发场景。
  • 生态丰富 :有 Express、Koa 等框架,开发效率高。

应用场景 :

  • 网页服务器 :处理用户访问,返回网页或数据。
  • API 服务 :为手机 App 或前端提供数据接口。
  • 实时应用 :如在线聊天、直播弹幕。

比喻 :

Node.js 像快餐店的唯一收银员,只有一双手(单线程),但她动作飞快,能一边收钱、一边打包,还把慢活(像烤汉堡)扔给后厨(后台),看起来像同时服务很多顾客。

示例 :

写一个简单的 Node.js 服务器,返回“欢迎”:

const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
res.end('欢迎使用 Node.js!');
});
server.listen(3000, () => console.log('服务器跑在 http://localhost:3000'));

运行步骤 :

  • 保存代码为 server.js。
  • 命令行运行:node server.js。
  • 浏览器访问 http://localhost:3000,看到“欢迎使用 Node.js!”。
  • 解释 :

    • http.createServer 创建服务器,监听 3000 端口。
    • 每次用户访问,Node.js 的主线程处理请求,返回响应。
    • 3000 端口是开发常用的非标准端口,正式部署可能用 80 端口。

    1.2 单线程 vs 多线程

    知识点 :

    线程是什么 ?

    线程是 CPU 执行任务的最小单位,像一个工人独立干活。CPU 通过“时间片”分配时间(比如每秒切换几百次),让多个线程看起来像同时运行。

    单线程(Node.js) :

    • Node.js 只有一个主线程,顺序处理任务,像一个收银员一次服务一个顾客。
    • 优点 :
      • 简单 :不用担心多个线程抢资源(像多个工人抢工具)。
      • 省内存 :一个线程占用的内存少,适合轻量服务器。
    • 缺点 :慢任务(像读大文件)可能阻塞主线程,其他请求得等着。
    • 解决办法 :Node.js 用异步把慢任务交给后台,主线程继续干别的。

    多线程 :

    • 像 Java 或 Python 的某些服务器,可以有多个线程同时干活,一个线程处理请求 A,另一个处理请求 B。
    • 优点 :能真正并行,适合 CPU 密集任务(像复杂计算)。
    • 缺点 :
      • 复杂 :线程间可能抢资源,需用“锁”协调,编程难度高。
      • 耗内存 :每个线程需要额外内存。

    Node.js 的后台线程 :

    虽然主线程是单线程,Node.js 内部用一个线程池(由 libuv 库提供)处理慢任务(像文件读写、网络请求)。这些后台线程对程序员透明,你只管写 JavaScript,Node.js 自动安排。

    CPU 时间片 :

    CPU 给每个线程分配短暂时间(几毫秒),快速切换,模拟并行。Node.js 单线程不用分时间片,靠事件循环调度任务。

    比喻 :

    • 单线程(Node.js) :一个厨师炒菜,动作快,把慢活(像煮汤)交给后厨,自己继续炒菜。
    • 多线程 :多个厨师同时炒菜,每人一个灶台,能并行,但可能抢锅,得协调好。
    • CPU 时间片 :老板给每个厨师几秒钟干活,快速轮换,看起来像同时炒菜。

    示例 :

    单线程(Node.js) :

    console.log('处理请求1');
    setTimeout(() => console.log('处理请求2'), 1000); // 慢任务,1秒后
    console.log('处理请求3');

    输出 :处理请求1 → 处理请求3 → (1秒后)处理请求2

    解释 :

    • 主线程先跑同步代码(请求1、请求3)。
    • setTimeout 是异步任务,交给后台,1秒后由事件循环调度输出 请求2。

    多线程(伪代码,假设 Java) :

    thread1: console.log('处理请求1');
    thread2: console.log('处理请求2');

    输出 :可能乱序,如 请求1 和 请求2 同时出现。

    解释 :两个线程并行跑,CPU 分配时间片,输出顺序不确定。

    1.3 为什么 Node.js 单线程还快?

    知识点 :

    Node.js 靠异步和事件循环解决单线程的瓶颈:

    • 异步 :慢任务(像读文件、访问网络)交给后台,主线程不等结果,继续处理其他任务。
    • 事件循环 :像一个任务调度员,不断检查后台任务是否完成,优先处理快任务。

    适用场景 :

    • 适合 I/O 密集任务 :像网络请求、文件操作,因为异步不阻塞。
    • 不适合 CPU 密集任务 :像复杂计算,因为单线程计算能力有限。

    高并发 :

    Node.js 能同时处理大量请求(比如 100 个用户访问),因为慢任务不占主线程,事件循环快速调度。

    比喻 :

    Node.js 像一个收银员,顾客点汉堡(慢任务)时,她把订单扔给后厨,自己继续收钱(处理新请求)。后厨做好汉堡,她再拿给顾客。

    示例 :

    异步处理多请求 :

    const http = require('http');
    http.createServer((req, res) => {
    setTimeout(() => res.end('慢请求完成!'), 1000); // 模拟慢请求
    console.log('收到一个请求');
    }).listen(3000, () => console.log('服务器跑在 http://localhost:3000'));

    运行 :

    浏览器快速访问 http://localhost:3000 多次。

    控制台输出 :

    收到一个请求
    收到一个请求
    收到一个请求
    收到一个请求
    (1秒后)
    慢请求完成!
    慢请求完成!
    慢请求完成!
    慢请求完成!

    解释 :

    • setTimeout 模拟慢任务,交给后台,主线程继续接收新请求。
    • 事件循环在 1 秒后调度慢任务,返回结果。

    2. 事件循环:Node.js 的“任务调度员”

    2.1 事件循环是什么?

    知识点 :

    定义 :事件循环(Event Loop)是 Node.js 的核心机制,负责调度任务,让单线程高效处理多任务。

    工作方式 :

    Node.js 维护两个任务队列:

    • 宏任务队列 :慢任务,如 setTimeout、文件读写(fs.readFile)、网络请求。
    • 微任务队列 :快任务,如 Promise 的 .then、process.nextTick。

    事件循环步骤 :

  • 执行所有同步代码(按顺序跑完)。
  • 清空微任务队列(快任务优先)。
  • 从宏任务队列取一个任务执行,再清空微任务队列。
  • 循环往复,直到队列为空。
  • 特点 :

    • 微任务优先于宏任务,确保快任务先完成。
    • 异步任务不阻塞主线程,主线程一直忙碌,效率高。

    为什么重要 :

    事件循环让 Node.js 单线程能模拟多任务并行,快速响应多个请求。

    比喻 :

    事件循环像快餐店的收银员,面前有两队顾客:

    • 微任务队 :点咖啡的顾客(几秒搞定,快)。
    • 宏任务队 :点汉堡的顾客(要烤面包,慢)。

    收银员先处理完所有咖啡订单(微任务),再做一个汉堡单(宏任务),效率最高。

    2.2 宏任务 vs 微任务

    知识点 :

    宏任务 :

    • 耗时任务,放入“慢队列”。
    • 常见类型:
      • setTimeout、setInterval:定时器,延迟执行。
      • fs.readFile:文件读写。
      • HTTP 请求:如访问外部 API。

    特点 :执行时间长,事件循环每次只处理一个宏任务。

    微任务 :

    • 快速任务,放入“快队列”。
    • 常见类型:
      • Promise 的 .then 或 .catch。
      • process.nextTick:Node.js 特有,优先级高于 Promise。

    特点 :优先级高,事件循环在处理宏任务前清空所有微任务。

    执行顺序 :

  • 同步代码先跑完。
  • 清空微任务队列。
  • 处理一个宏任务,再清空微任务队列,循环往复。
  • 比喻 :

    宏任务像点汉堡,收银员得等后厨烤好面包(慢)。

    微任务像点咖啡,收银员直接从机器拿(快)。

    收银员先把咖啡单全处理完,再去做一个汉堡单。

    示例 :

    console.log('Start');
    setTimeout(() => console.log('Macro task'), 0); // 宏任务
    Promise.resolve().then(() => console.log('Micro task')); // 微任务
    console.log('End');

    输出 :Start → End → Micro task → Macro task

    解释 :

    • 同步代码:console.log('Start') 和 console.log('End') 按顺序执行。
    • 微任务:Promise 的 .then 进入微任务队列,优先输出 Micro task。
    • 宏任务:setTimeout 进入宏任务队列,最后输出 Macro task。

    场景 :

    假设 setTimeout 是读文件(慢),Promise 是快速计算(快)。

    事件循环优先处理快任务,确保响应速度。

    更复杂示例 :

    console.log('任务1');
    setTimeout(() => {
    console.log('宏任务:慢请求');
    Promise.resolve().then(() => console.log('微任务:快回调'));
    }, 0);
    console.log('任务2');

    输出 :任务1 → 任务2 → 宏任务:慢请求 → 微任务:快回调

    解释 :

    • 同步代码:任务1、任务2 先跑。
    • 宏任务:setTimeout 触发“慢请求”。
    • 微任务:宏任务内的 Promise 触发“快回调”,优先于下一个宏任务。

    2.3 事件循环的高效性

    知识点 :

    高效原因 :

    • 异步任务不阻塞主线程,主线程可继续处理新请求。
    • 微任务优先,确保快速响应用户。
    • 宏任务分批处理,防止主线程卡在慢任务上。

    适用场景 :

    • 高并发 :像同时处理 100 个用户请求,事件循环快速调度。
    • 实时应用 :如聊天室,用户发送消息后立即收到响应。

    比喻 :

    收银员(主线程)把慢单(宏任务)扔给后厨,自己继续招呼新顾客。事件循环像她的记事本,提醒她哪些单做好了,优先处理咖啡单(微任务)。

    示例 :

    模拟高并发 :

    const http = require('http');
    http.createServer((req, res) => {
    console.log('收到请求:', req.url);
    Promise.resolve().then(() => console.log('微任务:快速处理'));
    setTimeout(() => {
    console.log('宏任务:慢处理');
    res.end('请求完成');
    }, 1000);
    }).listen(3000);

    运行 :

    浏览器快速访问 http://localhost:3000 多次。

    控制台输出 :

    收到请求:/favicon.ico
    微任务:快速处理
    收到请求:/
    微任务:快速处理
    收到请求:/
    微任务:快速处理
    收到请求:/
    微任务:快速处理
    (1秒后)
    宏任务:慢处理
    宏任务:慢处理
    宏任务:慢处理
    宏任务:慢处理

    解释 :主线程快速处理新请求,微任务优先,宏任务延后。

    3. Nginx:网络请求的“超级门卫”

    3.1 什么是 Nginx?

    知识点 :

    定义 :Nginx 是一个高性能的 Web 服务器和反向代理服务器,专门处理客户端请求(如浏览器访问)。

    反向代理 :

    • 客户端访问 Nginx(通常 80 或 443 端口),Nginx 把请求转发到后端服务器(如 Node.js 的 3000 端口)。
    • 客户端不知道后端服务器的存在,只跟 Nginx 打交道。

    作用 :

    • 转发请求 :把外界访问的 80 端口请求,转到 Node.js 的非标准端口(如 3000)。
    • 处理静态文件 :图片、CSS、HTML 等文件由 Nginx 直接返回,不麻烦 Node.js。
    • 负载均衡 :多个 Node.js 服务器时,Nginx 分配请求,防止某台过载。
    • 其他功能 :支持 HTTPS 加密、数据压缩、缓存,提升性能。

    为什么用 Nginx ?

    • Node.js 单线程不擅长处理静态文件或超高并发,Nginx 多线程更高效。
    • Nginx 能同时处理数千个请求,减轻 Node.js 压力。

    端口配置 :

    • Nginx 默认监听 80(HTTP)或 443(HTTPS)端口。
    • 需操作系统防火墙和云服务器安全组(若外网部署)开放对应端口。
    • 80 端口是知名端口,需管理员权限(Linux:sudo,Windows:管理员身份)。

    比喻 :

    Nginx 像饭店的门卫和服务员:

    • 客户(浏览器)来饭店(80 端口),门卫把订单转给后厨(Node.js 的 3000 端口)。
    • 如果客户要瓶装水(静态文件),门卫直接从柜台拿,不用问后厨。

    3.2 Nginx 怎么工作?

    知识点 :

    配置文件 :

    • Nginx 通过 nginx.conf 文件(通常在 /etc/nginx/nginx.conf)设置规则。
    • 关键指令:
      • listen 80;:监听 80 端口。
      • server_name:指定域名(如 example.com)。
      • proxy_pass:转发请求到后端(如 http://localhost:3000)。
      • root:静态文件路径(如 /var/www/static)。

    工作流程 :

  • 客户端访问 http://example.com (默认 80 端口)。
  • Nginx 收到请求,检查类型:
    • 静态文件(如 /images/cat.jpg):从硬盘返回。
    • 动态请求(如 /data):转发到 Node.js。
  • Node.js 处理后返回结果,Nginx 传给客户端 。

    防火墙和安全组 :

    • 本地防火墙 :服务器操作系统需开放 80 端口(Linux:ufw allow 80,Windows:允许 TCP 80)。
    • 安全组(云服务器) :云服务商控制台添加 TCP 80 规则,来源 0.0.0.0/0。
    • 两层都需开放,请求才能到达 Nginx。

    特点 :

    • Nginx 多线程,能处理高并发。
    • 静态文件处理快,Node.js 专注动态逻辑(如数据库查询)。

    比喻 :

    Nginx 是饭店前台,客户点单(请求),前台判断是拿饮料(静态文件)还是转给后厨(Node.js)。前台效率高,能同时接待很多客户。

    示例 :

    Nginx 配置 :

    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://localhost:3000; // 转发到 Node.js
    }
    location /images/ {
    root /var/www/static; // 静态文件路径
    }
    }

    Node.js 代码 :

    const express = require('express');
    const app = express();
    app.get('/data', (req, res) => res.send('动态数据'));
    app.listen(3000, () => console.log('Node.js 跑在 3000 端口'));

    运行 :

    • 用户访问 http://example.com/data ,Nginx 转发到 localhost:3000/data,Node.js 返回“动态数据”。
    • 用户访问 http://example.com/images/cat.jpg ,Nginx 直接返回 /var/www/static/images/cat.jpg。

    配置防火墙 :

    • Linux:sudo ufw allow 80(Nginx),sudo ufw allow 3000(Node.js)。
    • Windows:防火墙允许 TCP 80 和 3000。

    云服务器安全组 (阿里云) :

    • 添加规则:TCP 80,来源 0.0.0.0/0。

    测试 :

    • telnet localhost 80:确认 Nginx 端口开放。
    • curl [http://example.com/data](http://example.com/data) :返回“动态数据”。

    4. 同步 vs 异步:排队买票 vs 点外卖

    4.1 同步与异步的区别

    知识点 :

    同步 :

    • 任务按顺序执行,前一个任务没完成,后一个必须等着。
    • 像排队买票,一个人买完下一个才能买,效率低。

    异步 :

    • 任务可以“同时”开始,慢任务交给后台,主线程继续干别的。
    • 像点外卖,你下单后不用等着,厨师做好再送来。

    Node.js 的异步 :

    • 慢任务(像读文件、访问网络)交给后台,主线程不阻塞。
    • 常见异步方式:
      • 回调 :任务完成后调用函数。
      • Promise :封装异步任务,明确成功/失败状态。
      • async/await :让异步代码像同步一样写,简洁易读。

    为什么异步重要 :

    服务器需处理多个请求(像 100 个用户访问)。

    同步会让慢请求阻塞其他用户,异步让 Node.js 快速响应。

    比喻 :

    同步:你在饭店点餐,厨师做完你的菜再做下一个,慢得要命。

    异步:你点餐后,厨师同时做多人的菜,做好哪个送哪个,效率高。

    4.2 Node.js 的异步机制

    知识点 :

    回调 :

    • 最早的异步方式,任务完成后调用指定函数。
    • 缺点:多层回调导致“回调地狱”,代码难读。

    Promise :

    • 现代方式,封装异步任务,有成功(resolve)和失败(reject)状态。
    • 用 .then 或 .catch 处理结果,代码清晰。

    async/await :

    • 基于 Promise,让异步代码像同步写。
    • await 暂停任务,等异步结果,主线程跑其他任务。

    事件循环的角色 :

    异步任务的结果(回调、Promise)进入任务队列,事件循环决定何时执行。

    比喻 :

    • 回调 :你点外卖,告诉店家“做好后打我电话”。
    • Promise :你点外卖,店家给你订单号,承诺做好后通知。
    • async/await :你点外卖,店员说“在这等着,我做好给你”,你不用管细节。

    示例 :

    回调 :

    const fs = require('fs');
    fs.readFile('file.txt', (err, data) => {
    console.log('文件内容:', data);
    });
    console.log('继续其他任务');

    输出 :继续其他任务 → (读文件后)文件内容:…

    解释 :readFile 是异步任务,交给后台,主线程继续跑。

    Promise :

    const readFile = () => new Promise(resolve => {
    setTimeout(() => resolve('文件数据'), 1000);
    });
    readFile().then(data => console.log('文件内容:', data));
    console.log('继续其他任务');

    输出 :继续其他任务 → (1秒后)文件内容:文件数据

    async/await :

    async function readFile() {
    const data = await new Promise(resolve => setTimeout(() => resolve('文件数据'), 1000));
    console.log('文件内容:', data);
    }
    readFile();
    console.log('继续其他任务');

    输出 :继续其他任务 → (1秒后)文件内容:文件数据

    5. 线程 vs 协程:CPU 的工人与轻量助手

    5.1 线程

    知识点 :

    定义 :线程是 CPU 执行任务的最小单位,像一个工人独立干活。

    CPU 时间片 :

    • CPU 给每个线程分配短暂时间(几毫秒),快速切换,模拟并行。
    • 比如 3 个线程,CPU 每秒切换几百次,看起来像同时跑。

    Node.js 的线程 :

    • 主线程 :执行 JavaScript 代码,处理事件循环。
    • 后台线程池 :Node.js 内部用 libuv 提供的线程池处理慢任务(像文件读写、网络请求),对程序员透明。

    缺点 :

    • 线程切换有开销(像工人换工具),占内存多。
    • 多线程编程复杂,需处理资源竞争(像多个工人抢一个锅)。

    比喻 :

    线程像饭店的多个厨师,每人一个灶台,CPU 是老板,每人给几秒钟干活,快速轮换。

    5.2 协程

    知识点 :

    定义 :协程(Coroutine)是比线程更轻量的任务单位,像厨师的助手,只负责部分工作(比如切菜)。

    特点 :

    • 运行在同一线程内,切换由程序控制,不用 CPU 调度。
    • 切换开销小,内存占用少,适合高并发。

    Node.js 的协程 :

    • Node.js 没有真正协程,但用 async/await 模拟协程效果。
    • await 暂停任务,主线程跑其他任务,任务完成后再恢复。

    优点 :

    • 高效 :切换快,省资源。
    • 简单 :代码像同步写法,易读。

    比喻 :

    • 线程 :多个厨师,各自有灶台,切换时收拾工具,费时间。
    • 协程 :一个厨师带多个助手,切菜、炒菜快速切换,省力高效。

    示例 :

    线程(伪代码,假设多线程) :

    thread1: console.log('任务1');
    thread2: console.log('任务2');

    输出 :可能乱序,如 任务1、任务2 同时出现。

    协程(Node.js 的 async/await) :

    async function task1() {
    await new Promise(resolve => setTimeout(resolve, 1000));
    console.log('任务1');
    }
    async function task2() {
    console.log('任务2');
    }
    task1();
    task2();

    输出 :任务2 → (1秒后)任务1

    解释 :await 暂停任务1,主线程跑任务2,像协程切换。

    6. 综合例子:Node.js 服务器的运行

    场景 :

    你在阿里云 ECS(公网 IP:203.0.113.1)部署一个 Node.js 服务器,监听 3000 端口,处理动态请求。Nginx 监听 80 端口,转发请求到 Node.js,并处理静态文件。

    Node.js 代码 (server.js) :

    const express = require('express');
    const app = express();

    app.get('/data', async (req, res) => {
    console.log('开始处理请求');
    const data = await new Promise(resolve =>
    setTimeout(() => resolve('异步数据'), 1000)
    );
    console.log('请求处理完成');
    res.send(data);
    });

    app.listen(3000, () => console.log('Node.js 跑在 http://localhost:3000'));

    Nginx 配置 (/etc/nginx/nginx.conf) :

    server {
    listen 80;
    server_name example.com;
    location / {
    proxy_pass http://localhost:3000;
    }
    location /images/ {
    root /var/www/static;
    }
    }

    配置步骤 :

    Node.js :

  • 保存 server.js,运行 node server.js。
  • 监听 3000 端口,处理 /data 请求。
  • Nginx :

  • 编辑 nginx.conf,确保 listen 80; 和 proxy_pass http://localhost:3000;。
  • 重启 Nginx:sudo systemctl restart nginx。
  • 检查配置:sudo nginx -t。
  • 防火墙 :

    • Linux:sudo ufw allow 80(Nginx),sudo ufw allow 3000(Node.js)。
    • Windows:防火墙允许 TCP 80 和 3000。
    • 检查:sudo ufw status。

    安全组 (阿里云) :

    • 控制台 → ECS → 安全组 → 添加规则:
      • 协议:TCP
      • 端口:80/80
      • 来源:0.0.0.0/0

    测试 :

    • 本地:telnet localhost 80 和 telnet localhost 3000,确认端口开放。
    • 外网:curl [http://203.0.113.1/data](http://203.0.113.1/data) ,返回“异步数据”。

    运行流程 :

  • 用户访问 http://example.com/data (80 端口)。
  • 安全组检查:允许 TCP 80,请求到达云服务器。
  • 防火墙检查:允许 80 端口,请求到达 Nginx。
  • Nginx 转发:将请求送至 localhost:3000/data。
  • Node.js 处理:
    • 同步:console.log('开始处理请求')。
    • 异步:await 等待 1 秒,输出 请求处理完成,返回“异步数据”。
  • Nginx 返回 :将“异步数据”传给用户。

    事件循环 :

    • 微任务:Promise 完成,优先处理。
    • 宏任务:setTimeout 模拟慢请求。

    控制台输出 :

    Node.js 跑在 http://localhost:3000
    开始处理请求
    (1秒后)
    请求处理完成

    浏览器结果 :

    • 访问 http://example.com/data ,1 秒后看到“异步数据”。
    • 访问 http://example.com/images/cat.jpg ,Nginx 返回图片。

    7. 常见疑问

    Q1 :Node.js 单线程怎么处理高并发?

    A1 :异步任务不阻塞主线程,事件循环快速调度,慢任务交给后台。

    Q2 :为什么用 Nginx,不直接用 Node.js?

    A2 :Node.js 单线程处理静态文件慢,Nginx 多线程高效,还支持 HTTPS、缓存。

    Q3 :宏任务和微任务怎么区分?

    A3 :微任务是快任务(Promise、nextTick),优先级高;宏任务是慢任务(setTimeout、文件读写),后执行。

    Q4 :协程和线程的区别?

    A4 :线程是 CPU 分配的工人,切换耗资源;协程是程序控制的助手,切换快,Node.js 用 async/await 模拟。

    Q5 :80 端口没开怎么办?

    A5 :检查:telnet localhost 80。

    修复:sudo ufw allow 80(防火墙),阿里云安全组添加 TCP 80。

    8. 总结

    • Node.js :单线程,靠异步和事件循环高效处理请求。
    • 事件循环 :调度宏任务(慢)和微任务(快),微任务优先。
    • Nginx :反向代理,处理静态文件和请求转发,提升性能。
    • 同步与异步 :异步让 Node.js 快速响应多请求。
    • 线程与协程 :Node.js 用 async/await 模拟协程,高效轻量.
    • 端口配置 :Nginx 监听 80 端口,需开放防火墙和安全组。
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Node.js 服务器运行逻辑 / Nginx原理详解
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!