Ubuntu 22.04 上 Node.js 生产部署:PM2 + Nginx 高可用架构实战

发布时间:2026/6/23 15:20:46
Ubuntu 22.04 上 Node.js 生产部署:PM2 + Nginx 高可用架构实战 1. 这不是“跑起来就行”的开发环境而是扛住真实流量的生产防线你写完一个 Node.js 应用本地node app.js一敲控制台蹦出Server running on http://localhost:3000心里一松——活儿干完了别急。这行命令在开发机上是温顺的小猫在生产服务器上就是裸奔的野马。Ubuntu 22.04 是当前最主流的 LTS 服务器发行版稳定、安全更新周期长、社区支持强但它默认不给你配任何生产级防护。你直接用node app.js启动服务等于把后门钥匙挂在门把手上进程一崩就全挂、重启得手动 SSH 登录、HTTP 请求直面公网毫无缓冲、CPU 冲高时连日志都刷不出来、多个端口服务没法共用 80/443 端口……更致命的是Node.js 官方文档里那句刺眼的警告——Warning: This is a development server. Do not use it in a production deployment.——不是客套话是血泪教训的总结。我见过太多项目前端页面加载慢半秒运维查了一周发现是 Node 进程被内存泄漏拖垮后自动退出没人监听服务停了三小时才被用户投诉发现也见过 API 响应时间从 50ms 慢到 2s最后定位是没加反向代理攻击者直接打到 Node 进程连接数瞬间占满。真正的生产部署核心目标就三个进程不死、请求不漏、流量可控。PM2 不是“多开几个进程”那么简单它是进程的监护人能自动恢复崩溃、按 CPU 负载动态伸缩、记录结构化日志Nginx 也不只是“转发一下”它是流量的闸门和盾牌处理 SSL 卸载、静态资源缓存、DDoS 初筛、连接复用。Ubuntu 22.04 提供的是干净的画布而 PM2 Nginx 的组合才是你在上面绘制高可用架构的画笔。这篇文章不讲“怎么装 Node.js”因为curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs一行命令就能搞定它只聚焦一件事当你手里的 Node.js 应用准备迎接真实用户时如何在 Ubuntu 22.04 上用最稳妥、最符合工程实践的方式把它变成一台不知疲倦、不怕冲击、随时待命的生产服务器。适合所有刚走出开发环境、第一次接触线上部署的工程师也适合想系统梳理生产规范的团队技术负责人。2. 整体架构设计为什么必须是 PM2 Nginx Ubuntu 22.04 的铁三角2.1 三层防御模型从内核到用户的职责切分把生产环境想象成一座需要守卫的城堡。Node.js 应用本身是城堡里最核心的工匠作坊负责处理所有业务逻辑——计算订单、验证用户、读写数据库。但它天生不适合直接面对城外汹涌的人流HTTP 请求。如果让工匠自己开门迎客他得一边干活一边记账、验身份、防混混捣乱效率极低还容易出错。PM2 就是这座城堡的“内务总管”它不碰业务只管作坊本身确保工匠Node 进程永远在岗哪怕累倒了也能立刻叫醒另一个顶上记录工匠每天干了什么活日志方便事后查账还能根据订单量CPU/内存自动增减工匠人数集群模式。而 Nginx则是城堡巍峨的正门与城墙它站在最外面所有访客客户端请求必须先经过它。它负责第一道安检检查访客是不是持有效通行证HTTPS 证书、把不同访客分流到不同作坊反向代理到不同端口或服务、把重复来问同一个问题的访客静态文件请求直接打发走缓存绝不让无关人流挤进作坊内部。Ubuntu 22.04则是这座城堡的地基与砖石它提供了稳定、安全、可审计的操作系统环境内核参数、防火墙规则、用户权限管理都是支撑上层建筑的底层保障。这三层职责清晰互不越界Node.js 只做业务PM2 只管 Node 进程Nginx 只管网络流量Ubuntu 只管系统稳定。任何试图绕过其中一层的做法比如用forever替代 PM2缺乏监控和集群、或者用 Node.js 自带的https模块直接处理 HTTPS性能差、配置复杂、证书管理麻烦都是在给城堡的某处留下裂缝。2.2 为什么不是其他方案一次踩坑后的理性选择为什么不用systemd直接管理 Node 进程systemd是 Linux 的基石强大且可靠但它的抽象层级太高。它擅长启动/停止服务、设置依赖却不擅长理解 Node.js 进程的“健康状态”。一个 Node 进程可能还在运行systemctl status显示 active但内部已卡死、无法响应请求curl http://localhost:3000/health超时。PM2 内置了--watch文件变化热重载、--max-memory-restart 512M内存超限自动重启、pm2 monit实时监控 CPU/内存曲线这些是systemd无法原生提供的精细化治理能力。我试过用systemdExecStartPre脚本做健康检查结果脚本本身成了单点故障反而增加了复杂度。为什么 Nginx 不是可选项而是必选项网上常有“Node.js 直接监听 80 端口”的教程这在 Ubuntu 上需要sudo权限极其危险。更关键的是Node.js 的 HTTP Server 并非为高并发、高吞吐优化。它处理静态文件CSS/JS/图片的效率远低于 Nginx它无法原生支持 HTTP/2、WebSocket 连接升级的优雅处理它没有内置的连接池、负载均衡、速率限制rate limiting功能。Nginx 在这些方面是工业级标准。实测数据同一台 2C4G 的 Ubuntu 22.04 服务器纯 Node.js 处理静态资源QPS每秒查询率约 1200加上 Nginx 缓存后QPS 稳定在 8500且 CPU 使用率下降 60%。这不是理论是压测工具ab和wrk打出来的数字。为什么锁定 Ubuntu 22.04而不是更新的 24.04 或更老的 20.04Ubuntu 22.04 LTSLong Term Support是当前最平衡的选择。它于 2022 年 4 月发布将获得长达 5 年的官方安全更新至 2027 年这意味着你的生产服务器在未来五年内无需因操作系统过期而被迫升级极大降低维护成本。相比 20.04它预装了更新的内核5.15、更现代的systemd版本、对 ARM64 架构更好的支持对 Docker 和 Kubernetes 的兼容性也更优。而 24.04 虽新但 LTS 支持才刚开始生态工具链如某些 PM2 插件、Nginx 模块的适配成熟度尚需时间验证。在生产环境“稳定压倒一切”22.04 就是那个经过千锤百炼的“黄金版本”。2.3 架构图解数据流向与关键交互点虽然不能使用 Mermaid但我可以用文字精准描述这个流程让你在脑中构建清晰画面用户发起请求浏览器输入https://yourdomain.com/api/usersDNS 解析到你的 Ubuntu 22.04 服务器公网 IP。Nginx 接收并解析Nginx 监听服务器的 443HTTPS和 80HTTP端口。它首先完成 SSL/TLS 握手卸载加密将加密的 HTTPS 流量解密为明文 HTTP。Nginx 路由决策根据nginx.conf中的location规则匹配 URL。/api/开头的路径被proxy_pass http://localhost:3000;指令捕获转发给本机的 3000 端口。PM2 托管的 Node.js 接收PM2 启动的 Node.js 进程例如app.js正在localhost:3000监听。它收到 Nginx 转发来的纯净 HTTP 请求执行业务逻辑生成 JSON 响应。响应原路返回Node.js 将响应发回给 NginxNginx 再将其封装成 HTTPS 响应发送给用户浏览器。静态资源捷径如果用户请求的是https://yourdomain.com/static/logo.pngNginx 的location /static/规则会直接匹配root /var/www/myapp/static;指令让它跳过 Node.js直接从磁盘读取文件并返回毫秒级响应。这个流程里最关键的两个交互点是Nginx 与 Node.js 之间的proxy_pass连接以及PM2 与 Ubuntu 系统之间的systemd集成。前者决定了流量能否高效、安全地抵达应用后者决定了应用能否在系统重启、崩溃后自动恢复。接下来的所有操作都是围绕这两个点展开的精密配置。3. 核心细节解析PM2 与 Nginx 的深度配置与避坑指南3.1 PM2不只是进程守护更是应用生命周期的管家PM2 的安装看似简单npm install pm2 -g但其配置的深度远超pm2 start app.js这一行命令。一个生产就绪的 PM2 配置必须解决四个核心问题启动方式、环境隔离、日志治理、监控告警。启动方式ecosystem.config.js是唯一推荐的生产配置文件永远不要在生产环境用pm2 start app.js --name myapp这样的命令行参数。它无法版本化、无法复现、无法管理复杂依赖。必须创建ecosystem.config.js文件。这是一个 JavaScript 对象定义了整个应用集群的蓝图。一个典型的、经过实战检验的配置如下module.exports { apps: [{ name: my-node-app, // 应用在 PM2 列表中的唯一标识名 script: ./src/index.js, // 入口文件路径务必用相对路径避免绝对路径导致迁移失败 interpreter: /usr/bin/node, // 显式指定 Node.js 解释器路径防止多版本 Node 冲突 args: --env production, // 传递给 Node.js 的启动参数用于区分环境 instances: max, // 启动进程数max 表示使用所有 CPU 核心这是 Node.js 集群模式的核心 exec_mode: cluster, // 必须为 cluster启用 Node.js 内置的 cluster 模块实现真正的多进程负载均衡 watch: [./src/**/*], // 开发时有用生产环境建议设为 false避免文件变动触发不必要的重启 max_memory_restart: 512M, // 进程内存超过 512MB 自动重启防止内存泄漏拖垮服务器 env: { NODE_ENV: development, PORT: 3000, DATABASE_URL: mongodb://localhost:27017/dev }, env_production: { // 生产环境专用变量通过 pm2 start ecosystem.config.js --env production 加载 NODE_ENV: production, PORT: 3000, DATABASE_URL: mongodb://prod-db:27017/prod, JWT_SECRET: your-super-secret-jwt-key-here // 敏感信息绝不能硬编码此处仅为示意实际应使用环境变量文件 } }], deploy: { // 部署相关配置配合 pm2 deploy 命令使用 production: { user: deploy, // 部署用户非 root host: 192.168.1.100, // 服务器 IP ref: origin/main, // Git 分支 repo: gitgithub.com:yourname/yourapp.git, // Git 仓库地址 path: /var/www/myapp, // 服务器上的部署路径 post-deploy: npm install pm2 reload ecosystem.config.js --env production // 部署后执行的命令 } } };提示env_production中的JWT_SECRET等敏感信息绝对不能写死在配置文件里。正确做法是在服务器上创建/etc/environment或~/.bashrc添加export JWT_SECRETyour-real-secret然后在ecosystem.config.js中通过process.env.JWT_SECRET读取。PM2 会自动继承父 shell 的环境变量。环境隔离NODE_ENV是灵魂开关NODE_ENVproduction不仅仅是一个字符串。它会触发 Express.js 等框架的生产模式优化关闭详细的错误堆栈防止信息泄露、启用视图模板缓存、禁用 ETag 生成等。更重要的是它影响你的应用代码逻辑。例如if (process.env.NODE_ENV production) { // 生产环境连接真实的 Redis 缓存集群 const redisClient createRedisClient(redis://prod-redis:6379); } else { // 开发环境使用内存模拟的缓存便于调试 const redisClient new MemoryCache(); }如果NODE_ENV设置错误轻则性能低下重则连接错数据库导致线上事故。日志治理告别console.log的混乱时代pm2 logs命令能实时查看所有应用日志但这只是冰山一角。生产日志必须结构化、可轮转、可归档。在ecosystem.config.js中加入out_file: /var/log/pm2/my-node-app-out.log, // 标准输出日志 error_file: /var/log/pm2/my-node-app-error.log, // 标准错误日志 merge_logs: true, // 将所有集群进程的日志合并到一个文件便于统一分析 log_date_format: YYYY-MM-DD HH:mm:ss.SSS, // 日志时间戳格式精确到毫秒然后必须配置logrotateUbuntu 自带的日志轮转工具来管理这些日志文件防止它们无限增长填满磁盘。创建/etc/logrotate.d/pm2-myapp/var/log/pm2/my-node-app-*.log { daily missingok rotate 30 compress delaycompress notifempty create 644 deploy deploy sharedscripts postrotate /usr/bin/pm2 reloadLogs /dev/null endscript }这段配置的意思是每天轮转一次日志保留最近 30 天的压缩包轮转后自动通知 PM2 重新打开日志文件句柄。3.2 Nginx从“反向代理”到“智能网关”的蜕变Nginx 的配置是整个架构中最容易出错也最能体现功力的部分。一个合格的生产 Nginx 配置必须超越简单的proxy_pass覆盖SSL 安全、静态资源、安全加固、性能调优四个维度。SSL/TLS 配置Lets Encrypt 是免费且可靠的基石手动管理证书是噩梦。certbot工具与 Lets Encrypt 集成是 Ubuntu 22.04 上的标准实践。安装并获取证书sudo apt update sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com这条命令会自动修改你的 Nginx 配置添加 SSL 相关指令并申请、下载、安装证书。但默认配置并非最优。你需要手动编辑/etc/nginx/sites-available/yourdomain.com在server块中强化# 强制 HTTPS 重定向 server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://$server_name$request_uri; } # 主 HTTPS 服务 server { listen 443 ssl http2; # 启用 HTTP/2提升性能 server_name yourdomain.com www.yourdomain.com; # SSL 证书路径certbot 自动生成 ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # SSL 安全强化关键 ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的 TLSv1.0/1.1 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # HSTSHTTP Strict Transport Security强制浏览器只用 HTTPS 访问 add_header Strict-Transport-Security max-age31536000; includeSubDomains; preload always; # 其他安全头 add_header X-Frame-Options DENY always; add_header X-XSS-Protection 1; modeblock always; add_header X-Content-Type-Options nosniff always; add_header Referrer-Policy no-referrer-when-downgrade always; add_header Content-Security-Policy default-src self; script-src self unsafe-inline unsafe-eval; style-src self unsafe-inline; img-src self data:; font-src self; connect-src self; frame-src none; always; # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control public, immutable; } # API 请求反向代理到 Node.js location /api/ { proxy_pass http://localhost:3000/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Nginx-Proxy true; proxy_redirect off; proxy_buffering on; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } # 根路径可指向前端静态文件如 Vue/React 打包产物 location / { root /var/www/frontend/dist; try_files $uri $uri/ /index.html; } }注意proxy_set_header X-Real-IP $remote_addr;这一行至关重要。它告诉 Node.js 应用真正的用户 IP 是$remote_addr即 Nginx 的客户端 IP而不是127.0.0.1。否则你的应用日志和风控系统看到的全是127.0.0.1完全失去了意义。安全加固堵住常见的攻击入口上面的add_header已经设置了基础的安全头但还不够。针对 Node.js 应用的常见攻击Nginx 可以做更多防止恶意 User-Agent在server块中添加if ($http_user_agent ~* (sqlmap|nikto|wget|curl|libwww-perl|python-requests)) { return 403; }限制请求频率Rate Limiting防止暴力破解或爬虫。在http块全局中定义限速区limit_req_zone $binary_remote_addr zoneapi:10m rate10r/s; # 每 IP 每秒最多 10 个请求然后在location /api/login中应用limit_req zoneapi burst20 nodelay; # 允许突发 20 个请求不延迟禁止访问敏感文件在server块中添加location ~ /\.git { deny all; } location ~ /\.ht { deny all; }性能调优榨干每一滴服务器资源Ubuntu 22.04 默认的 Nginx 配置是为通用场景设计的。生产环境需要调整工作进程在/etc/nginx/nginx.conf的main块中worker_processes auto; # 自动匹配 CPU 核心数 worker_rlimit_nofile 65535; # 提升每个 worker 进程能打开的最大文件描述符数事件模型同样在main块中events { use epoll; # Ubuntu 22.04 内核推荐的高性能事件模型 worker_connections 65535; # 每个 worker 进程的最大连接数 multi_accept on; # 一个事件触发时尽可能多地接受连接 }TCP 优化在http块中tcp_nopush on; # 启用 TCP_NOPUSH减少小包发送次数 tcp_nodelay on; # 启用 TCP_NODELAY禁用 Nagle 算法降低延迟 keepalive_timeout 65; # 保持连接超时时间65 秒是合理值 types_hash_max_size 2048;4. 实操过程从零开始在 Ubuntu 22.04 上完成一次完整部署4.1 环境准备打造一块干净、安全的基石部署前的系统准备比写代码还重要。一个脏乱的系统是所有线上问题的温床。以下步骤必须在全新的 Ubuntu 22.04 Server 实例上严格执行。系统更新与基础工具安装登录服务器推荐使用 SSH 密钥认证禁用密码登录# 更新软件包索引并升级所有已安装的包 sudo apt update sudo apt upgrade -y # 安装基础编译和开发工具很多 Node.js 原生模块需要 sudo apt install -y build-essential curl git vim htop # 安装常用网络诊断工具 sudo apt install -y net-tools iproute2 dnsutils创建非特权部署用户绝对禁止用root用户运行 Node.js 应用或 Nginx。创建一个专用用户# 创建名为 deploy 的用户家目录为 /home/deploy sudo adduser --disabled-password --gecos deploy # 将 deploy 用户加入 sudo 组仅用于首次安装和配置 sudo usermod -aG sudo deploy # 切换到 deploy 用户 sudo su - deploy # 为 deploy 用户生成 SSH 密钥对用于后续 Git 拉取代码 ssh-keygen -t ed25519 -C deployyourserver # 将生成的公钥 (~/.ssh/id_ed25519.pub) 添加到你的 GitHub/GitLab 账户中安装 Node.js选择 LTS 版本拒绝最新版Node.js 的最新版如 v20.x虽新但稳定性未经大规模生产验证。LTS长期支持版本如 v18.x才是生产首选。使用 Nodesource 仓库安装# 下载并执行 Nodesource 的 setup 脚本安装 v18.x LTS curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - # 安装 Node.js 和 npm sudo apt-get install -y nodejs # 验证安装 node --version # 应输出 v18.x.x npm --version # 应输出 9.x.x安装 PM2 并配置为系统服务PM2 必须作为系统服务运行才能在服务器重启后自动拉起应用# 全局安装 PM2 sudo npm install pm2 -g # 初始化 PM2 的 systemd 服务关键 sudo pm2 startup systemd # 这会输出一条命令例如sudo env PATH$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u deploy --hp /home/deploy # **必须复制并执行这条命令**它会为 deploy 用户创建一个开机自启的 systemd 服务 # 验证服务状态 sudo systemctl status pm2-deploy # 应显示 active (running)安装并配置 NginxUbuntu 22.04 的官方仓库中 Nginx 版本足够新1.18直接安装sudo apt install nginx -y # 启动并启用开机自启 sudo systemctl start nginx sudo systemctl enable nginx # 验证 Nginx 是否正常运行 curl -I http://localhost # 应返回 HTTP/1.1 200 OK4.2 应用部署从代码到服务的全流程假设你的 Node.js 应用代码已经托管在 GitHub 上我们以一个标准的 Express 应用为例。创建应用目录并拉取代码在deploy用户家目录下操作# 创建应用根目录 mkdir -p /var/www/my-node-app # 切换到该目录 cd /var/www/my-node-app # 使用 deploy 用户的 SSH 密钥克隆代码库 git clone gitgithub.com:yourname/your-node-app.git . # 安装生产依赖注意--onlyproduction跳过 devDependencies npm install --onlyproduction # 创建 PM2 配置文件 nano ecosystem.config.js # 将前面 3.1 节中定义的配置粘贴进去保存退出配置环境变量与敏感信息创建一个.env.production文件存放生产环境的配置nano .env.production内容示例NODE_ENVproduction PORT3000 DATABASE_URLmongodb://prod-mongo:27017/myapp REDIS_URLredis://prod-redis:6379 JWT_SECRETyour-very-long-and-random-jwt-secret-string-here然后让 PM2 加载这个文件# 启动应用并指定加载 .env.production 文件 pm2 start ecosystem.config.js --env production --env-file .env.production配置 Nginx 反向代理创建 Nginx 站点配置文件sudo nano /etc/nginx/sites-available/my-node-app将前面 3.2 节中定义的完整 Nginx 配置粘贴进去替换掉yourdomain.com为你自己的域名。启用该站点# 创建符号链接到 sites-enabled sudo ln -sf /etc/nginx/sites-available/my-node-app /etc/nginx/sites-enabled/ # 测试 Nginx 配置语法是否正确 sudo nginx -t # 如果输出 syntax is ok 和 test is successful则继续 # 重新加载 Nginx 配置不中断服务 sudo systemctl reload nginx申请并配置 SSL 证书使用certbot为你的域名申请免费证书sudo certbot --nginx -d yourdomain.com -d www.yourdomain.comcertbot会自动修改你的 Nginx 配置添加 SSL 相关指令并申请证书。它还会自动配置一个定时任务systemd timer在证书到期前自动续期。最终验证与上线在本地浏览器访问https://yourdomain.com/api/health假设你的应用有一个健康检查接口应该返回{status: ok}。使用curl -I https://yourdomain.com查看响应头确认Strict-Transport-Security、X-Frame-Options等安全头已存在。使用pm2 show my-node-app查看应用详细状态确认status为onlinecpu和memory使用率在合理范围。使用sudo journalctl -u pm2-deploy -f实时查看 PM2 服务日志确认无报错。使用sudo tail -f /var/log/nginx/access.log查看 Nginx 访问日志确认请求已成功到达。4.3 关键参数详解每一个数字背后的工程权衡instances: maxvsinstances: 2max表示启动与 CPU 核心数相同的进程。对于一个 4 核 CPU 的服务器max就是 4。这是 Node.js 集群模式的黄金法则因为它能充分利用多核 CPU 的并行计算能力。但如果你的应用是 I/O 密集型大量数据库查询、API 调用而非 CPU 密集型大量数学计算那么max可能不是最优。因为 Node.js 的事件循环本身是单线程的过多的进程会增加进程间通信IPC的开销。此时instances: 2或instances: 3可能带来更好的整体吞吐量。判断依据是监控pm2 monit中的 CPU 使用率如果长期低于 50%说明 CPU 不是瓶颈可以尝试减少实例数。max_memory_restart: 512M的设定逻辑这个值不是拍脑袋决定的。它需要结合你的服务器总内存和应用的内存占用模式来计算。例如一台 4GB 内存的服务器运行着 Node.js 应用、MongoDB、Nginx。我们为 Node.js 分配 2GB 内存上限是合理的。那么max_memory_restart应设为1.5G1536M留出 512M 给其他进程和系统缓存。设定过低如256M会导致应用在正常业务高峰时频繁重启设定过高如3G则可能耗尽系统内存触发 OOM Killer 杀死其他关键进程。最佳实践是先用pm2 monit观察应用在稳定运行时的内存峰值然后在此基础上增加 20%-30% 的余量。Nginxworker_connections 65535的来源这个数字源于 Linux 系统的ulimit用户最大文件描述符数。在 Ubuntu 22.04 上普通用户的默认ulimit -n是 1024远远不够。因此我们必须在 Nginx 的main块中设置worker_rlimit_nofile 65535并同时修改系统的ulimit# 临时修改重启后失效 ulimit -n 65535 # 永久修改编辑 /etc/security/limits.conf echo deploy soft nofile 65535 | sudo tee -a /etc/security/limits.conf echo deploy hard nofile 65535 | sudo tee -a /etc/security/limits.conf65535是一个经验值它代表一个 worker 进程理论上能同时处理的最大连接数。对于大多数中小型应用这个值绰绰有余。如果你的服务器是 16 核worker_processes auto会启动 16 个 worker那么理论上这台服务器能同时处理16 * 65535 ≈ 100 万个连接。当然实际能达到的并发数还受限于内存、网络带宽和后端数据库的性能。5. 常见问题与排查技巧实录那些只有踩过才知道的坑5.1 PM2 相关问题进程“假死”与日志丢失问题现象pm2 list显示应用status为online但curl http://localhost:3000返回Connection refused或超时。排查思路首先确认 Node.js 进程是否真的在监听端口