凌峰创科服务平台

Node.js在Linux服务器上如何高效部署与运维?

目录

  1. 为什么选择在 Linux 服务器上运行 Node.js?
  2. 环境准备
    • 选择 Linux 发行版 (Ubuntu / CentOS)
    • 连接服务器 (SSH)
  3. 安装 Node.js 和 npm
    • 使用包管理器 (简单,但版本可能旧)
    • 使用 NodeSource 仓库 (推荐,可安装最新稳定版)
    • 使用 n (Node 版本管理器) (灵活,推荐开发者使用)
    • 手动编译安装 (最灵活,但复杂)
  4. 项目部署流程
    • 步骤 1: 代码上传
    • 步骤 2: 安装项目依赖
    • 步骤 3: 配置环境变量
    • 步骤 4: 使用 PM2 部署 (核心,守护进程)
    • 步骤 5: 配置 Nginx 作为反向代理 (可选但强烈推荐)
  5. 性能优化与安全加固
    • 使用 PM2 管理进程
    • 配置 Nginx 反向代理
    • 开启 HTTPS (Let's Encrypt)
    • 使用进程管理器 (systemd)
  6. 常见问题与解决方案
    • 端口被占用
    • 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:企业级首选,极其稳定,使用 yumdnf 包管理器,如果你追求极致的稳定性,可以选择它们,本文将以 Ubuntu 22.04 为例进行讲解。

连接服务器

使用 SSH (Secure Shell) 客户端连接到你的 Linux 服务器,在 macOS 或 Linux 终端中,或在 Windows 的 PowerShell/CMD 中使用以下命令:

Node.js在Linux服务器上如何高效部署与运维?-图1
(图片来源网络,侵删)
# 替换 username 为你的服务器用户名,server_ip 为你的服务器 IP 地址
ssh username@server_ip

首次连接时,系统会提示你确认服务器的指纹,输入 yes 即可,之后会提示你输入密码。


安装 Node.js 和 npm

这里推荐使用 方法二方法三,因为它们能让你轻松安装并管理最新的 Node.js 版本。

使用 NodeSource 仓库 (推荐)

这是最推荐的方法,可以轻松安装最新稳定版 Node.js。

  1. 更新包列表

    Node.js在Linux服务器上如何高效部署与运维?-图2
    (图片来源网络,侵删)
    sudo apt update
  2. 安装 Node.js 20.x (LTS 版本) 访问 NodeSource 官网 获取最新的安装命令,以 Node.js 20.x 为例:

    # 下载并执行 NodeSource 安装脚本
    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
  3. 安装 Node.js

    sudo apt-get install -y nodejs
  4. 验证安装

    node -v
    npm -v

    你应该能看到安装的版本号,v20.10.0

    Node.js在Linux服务器上如何高效部署与运维?-图3
    (图片来源网络,侵删)

使用 n (Node 版本管理器)

如果你是开发者,需要频繁切换 Node.js 版本,n 是一个非常轻量且强大的工具。

  1. 先安装一个基础版本的 Node.js (可以使用方法二或方法一)

    sudo apt install nodejs npm
  2. 全局安装 n

    sudo npm install -g n
  3. 使用 n 安装指定版本的 Node.js

    # 安装最新的 LTS (长期支持) 版本
    sudo n lts
    # 安装最新的稳定版
    sudo n latest
    # 安装指定版本,v18.19.0
    sudo n 18.19.0
  4. 验证安装

    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 dotenvapp.js (或你的入口文件) 顶部添加: require('dotenv').config();

步骤 4: 使用 PM2 部署 (核心)

PM2 是一个功能强大的 Node.js 进程管理器,它可以帮助你:

  • 保持应用永远在线 (自动重启)
  • 负载均衡 (可以同时运行多个实例)
  • 日志管理
  • 监控应用状态
  1. 全局安装 PM2

    npm install -g pm2
  2. 启动你的应用

    # pm2 start <入口文件> --name <自定义进程名>
    pm2 start app.js --name "my-api"
  3. 常用 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 应用。

  1. 安装 Nginx

    sudo apt update
    sudo apt install nginx
  2. 创建 Nginx 配置文件

    sudo nano /etc/nginx/sites-available/my-node-app
  3. 粘贴以下配置

    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;
        }
    }
  4. 启用配置并测试

    # 创建一个软链接到 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

在 Linux 服务器上部署 Node.js 应用是一个标准化的流程,掌握它可以让你轻松管理任何 Node.js 后端服务。

核心流程回顾:

  1. 准备环境:连接服务器,更新系统。
  2. 安装 Node.js:推荐使用 NodeSource 仓库或 n 版本管理器。
  3. 部署代码:使用 git 上传代码。
  4. 安装依赖npm install
  5. 配置环境:使用 .env 管理变量。
  6. 使用 PM2pm2 start 启动并管理应用。
  7. 配置 Nginx:设置反向代理,将外部流量转发到 Node.js 应用。

遵循以上步骤,你就可以搭建一个稳定、安全、高性能的 Node.js 生产环境。

分享:
扫描分享到社交APP
上一篇
下一篇