目录
- 为什么选择在 Linux 服务器上运行 Node.js?
- 环境准备
- 选择 Linux 发行版 (Ubuntu / CentOS)
- 连接服务器 (SSH)
- 安装 Node.js 和 npm
- 使用包管理器 (简单,但版本可能旧)
- 使用 NodeSource 仓库 (推荐,可安装最新稳定版)
- 使用 n (Node 版本管理器) (灵活,推荐开发者使用)
- 手动编译安装 (最灵活,但复杂)
- 项目部署流程
- 步骤 1: 代码上传
- 步骤 2: 安装项目依赖
- 步骤 3: 配置环境变量
- 步骤 4: 使用 PM2 部署 (核心,守护进程)
- 步骤 5: 配置 Nginx 作为反向代理 (可选但强烈推荐)
- 性能优化与安全加固
- 使用 PM2 管理进程
- 配置 Nginx 反向代理
- 开启 HTTPS (Let's Encrypt)
- 使用进程管理器 (systemd)
- 常见问题与解决方案
- 端口被占用
EACCES: permission denied权限问题Error: listen EADDRINUSE地址已在使用- 如何查看日志?
为什么选择在 Linux 服务器上运行 Node.js?
- 高性能:Linux 内核对网络和高并发处理有天然优势,Node.js 的非阻塞 I/O 模型在 Linux 上能发挥出最佳性能。
- 稳定性:Linux 服务器以其稳定性和可靠性著称,非常适合作为后端服务运行环境。
- 成本效益:绝大多数 Linux 发行版都是免费和开源的,可以大大降低服务器成本。
- 灵活性:你可以完全控制服务器环境,从内核参数到软件安装,都能根据需求进行深度定制。
- 生态友好:Node.js 的生态系统和工具链在 Linux 环境下最为完善和成熟。
环境准备
选择 Linux 发行版
- Ubuntu:对于新手来说非常友好,社区庞大,文档丰富,使用
apt包管理器,命令简单直观,推荐版本:04 LTS(长期支持版)。 - CentOS / Rocky Linux / AlmaLinux:企业级首选,极其稳定,使用
yum或dnf包管理器,如果你追求极致的稳定性,可以选择它们,本文将以 Ubuntu 22.04 为例进行讲解。
连接服务器
使用 SSH (Secure Shell) 客户端连接到你的 Linux 服务器,在 macOS 或 Linux 终端中,或在 Windows 的 PowerShell/CMD 中使用以下命令:

# 替换 username 为你的服务器用户名,server_ip 为你的服务器 IP 地址 ssh username@server_ip
首次连接时,系统会提示你确认服务器的指纹,输入 yes 即可,之后会提示你输入密码。
安装 Node.js 和 npm
这里推荐使用 方法二 或 方法三,因为它们能让你轻松安装并管理最新的 Node.js 版本。
使用 NodeSource 仓库 (推荐)
这是最推荐的方法,可以轻松安装最新稳定版 Node.js。
-
更新包列表
(图片来源网络,侵删)sudo apt update
-
安装 Node.js 20.x (LTS 版本) 访问 NodeSource 官网 获取最新的安装命令,以 Node.js 20.x 为例:
# 下载并执行 NodeSource 安装脚本 curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
-
安装 Node.js
sudo apt-get install -y nodejs
-
验证安装
node -v npm -v
你应该能看到安装的版本号,
v20.10.0。
(图片来源网络,侵删)
使用 n (Node 版本管理器)
如果你是开发者,需要频繁切换 Node.js 版本,n 是一个非常轻量且强大的工具。
-
先安装一个基础版本的 Node.js (可以使用方法二或方法一)
sudo apt install nodejs npm
-
全局安装
nsudo npm install -g n
-
使用
n安装指定版本的 Node.js# 安装最新的 LTS (长期支持) 版本 sudo n lts # 安装最新的稳定版 sudo n latest # 安装指定版本,v18.19.0 sudo n 18.19.0
-
验证安装
node -v
你会看到
n为你安装的版本。
项目部署流程
假设你的 Node.js 项目已经开发完成,并且有一个 package.json 文件。
步骤 1: 代码上传
将你的项目代码从本地电脑上传到服务器,推荐使用 git,也可以使用 scp 或 SFTP 客户端。
使用 Git (推荐):
# 在服务器上创建一个项目目录 sudo mkdir -p /var/www/my-node-app sudo chown $USER:$USER /var/www/my-node-app # 将目录所有者改为当前用户 cd /var/www/my-node-app # 克隆你的代码仓库 git clone https://github.com/your-username/your-repo.git .
步骤 2: 安装项目依赖
cd /var/www/my-node-app npm install --production # 如果是生产环境,只安装 dependencies,不安装 devDependencies
步骤 3: 配置环境变量
你的应用可能需要一些敏感信息,如数据库密码、API 密钥等。永远不要把这些信息硬编码在代码里!
创建一个 .env 文件:
# 在项目根目录下创建 nano .env
在 .env 文件中添加你的变量:
DB_HOST=localhost DB_USER=myuser DB_PASS=mypassword PORT=3000
重要:确保 .env 文件被添加到 .gitignore 中,不要上传到代码仓库。
然后在你的代码中,使用 dotenv 包来加载这些变量:
npm install dotenv
在 app.js (或你的入口文件) 顶部添加:
require('dotenv').config();
步骤 4: 使用 PM2 部署 (核心)
PM2 是一个功能强大的 Node.js 进程管理器,它可以帮助你:
- 保持应用永远在线 (自动重启)
- 负载均衡 (可以同时运行多个实例)
- 日志管理
- 监控应用状态
-
全局安装 PM2
npm install -g pm2
-
启动你的应用
# pm2 start <入口文件> --name <自定义进程名> pm2 start app.js --name "my-api"
-
常用 PM2 命令
# 查看所有进程状态 pm2 list # 查看某个进程的日志 pm2 logs my-api # 停止某个进程 pm2 stop my-api # 重启某个进程 pm2 restart my-api # 删除某个进程 pm2 delete my-api # 生成开机自启配置 pm2 startup # 根据提示执行生成的命令
步骤 5: 配置 Nginx 作为反向代理 (强烈推荐)
直接让 Node.js 应用监听 80 或 443 端口不安全且不灵活,Nginx 可以作为反向代理,将来自外部的请求转发给你的 Node.js 应用。
-
安装 Nginx
sudo apt update sudo apt install nginx
-
创建 Nginx 配置文件
sudo nano /etc/nginx/sites-available/my-node-app
-
粘贴以下配置
server { listen 80; server_name your_domain.com www.your_domain.com; # 替换成你的域名或服务器IP location / { proxy_pass http://localhost:3000; # 假设你的Node.js应用运行在3000端口 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } -
启用配置并测试
# 创建一个软链接到 sites-enabled 目录以启用站点 sudo ln -s /etc/nginx/sites-available/my-node-app /etc/nginx/sites-enabled/ # 测试 Nginx 配置是否正确 sudo nginx -t # 如果测试成功,重新加载 Nginx sudo systemctl reload nginx
访问 your_domain.com 或服务器 IP,Nginx 就会将请求转发到你的 Node.js 应用了。
性能优化与安全加固
- 使用 PM2 集群模式:充分利用多核 CPU,提高并发处理能力。
# 根据CPU核心数启动实例,例如4个 pm2 start app.js -i 4 --name "my-api-cluster"
- 配置 Nginx 反向代理:如上所述,这是生产环境的标配。
- 开启 HTTPS:使用 Let's Encrypt 提供的免费证书,配合 Nginx 可以轻松开启 HTTPS,保障数据传输安全。
- 使用
systemd管理服务:虽然 PM2 可以开机自启,但更规范的做法是为你的 Node.js 应用创建一个systemd服务单元,这能让你的应用像系统其他服务一样被管理 (start,stop,enable,status),并且与系统日志 (journalctl) 集成。
常见问题与解决方案
-
端口被占用
- 问题:
Error: listen EADDRINUSE :::3000 - 解决:找到占用端口的进程并杀掉它。
# 查找占用3000端口的进程ID sudo lsof -i :3000 # 假设返回的PID是 1234 # 杀掉该进程 sudo kill -9 1234
- 问题:
-
EACCES: permission denied权限问题- 问题:使用
npm install -g安装全局包时提示权限不足。 - 解决:不要使用
sudo npm install -g,这会破坏系统权限,推荐使用npx或配置 npm 的全局目录。- 临时解决:
sudo npm install -g <package-name> - 最佳实践:配置 npm 的全局目录到用户主目录下。
mkdir ~/.npm-global npm config set prefix '~/.npm-global' # 然后把 ~/.npm-global/bin 添加到 PATH 环境变量中 echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc source ~/.bashrc
之后就可以直接
npm install -g <package-name>而无需sudo。
- 临时解决:
- 问题:使用
-
如何查看日志?
- PM2 日志:
pm2 logs <app_name> - 系统日志 (systemd):如果你的应用是作为 systemd 服务运行的,使用
journalctl。# 查看实时日志 journalctl -u my-node-app.service -f # 查看最近100行日志 journalctl -u my-node-app.service -n 100
- PM2 日志:
在 Linux 服务器上部署 Node.js 应用是一个标准化的流程,掌握它可以让你轻松管理任何 Node.js 后端服务。
核心流程回顾:
- 准备环境:连接服务器,更新系统。
- 安装 Node.js:推荐使用 NodeSource 仓库或
n版本管理器。 - 部署代码:使用
git上传代码。 - 安装依赖:
npm install。 - 配置环境:使用
.env管理变量。 - 使用 PM2:
pm2 start启动并管理应用。 - 配置 Nginx:设置反向代理,将外部流量转发到 Node.js 应用。
遵循以上步骤,你就可以搭建一个稳定、安全、高性能的 Node.js 生产环境。
