Node.js 项目如何部署到 Ubuntu:从运行环境到 PM2 与 Nginx 的完整流程

一颗松果
一颗松果
发布时间:2026-08-25| 194人浏览过
原创

前言

很多人第一次把 Node.js 项目放到 Ubuntu 服务器上,卡住的往往不是代码本身,而是部署链路:环境怎么装、应用怎么常驻、域名又怎么接进来。下面按“能跑起来”和“适合长期运行”两条线整理一遍,从 Node.js 16 安装、项目初始化到 PM2 与 Nginx 配置,方便你一步步核对,也能判断自己的服务目前缺哪一环。

很多人第一次把 Node.js 项目放到 Ubuntu 服务器上,卡住的往往不是代码本身,而是部署链路:环境怎么装、应用怎么常驻、域名又怎么接进来。下面按“能跑起来”和“适合长期运行”两条线整理一遍,从 Node.js 16 安装、项目初始化到 PM2 与 Nginx 配置,方便你一步步核对,也能判断自己的服务目前缺哪一环。

安装 Node.js 和 npm

在 Ubuntu 上,先把运行环境准备好。原文给出的做法是使用 NodeSource 的官方二进制分发库,直接安装 16.x 版本:

# 添加NodeSource库
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
# 安装Node.js和npm
sudo apt-get install -y nodejs

安装完成后,可以立即检查版本,确认 Node.js 和 npm 已经可用:

node -v
npm -v

只要能正常输出版本号,说明运行时环境已经装好,后续项目依赖和启动命令才有执行基础。

创建目录并初始化项目

服务器上最好给项目单独准备一个目录,避免部署文件和其他服务混在一起。原文示例使用的是一个名为 my-nodejs-app 的目录:

mkdir my-nodejs-app
cd my-nodejs-app

如果你是把现有项目上传到服务器,这一步至少也能作为统一工作目录来使用。

接下来,如果当前目录里还没有 package.json,可以用 npm 快速初始化:

npm init -y

-y 会直接使用默认配置生成项目描述文件,适合快速起步。对于已经存在完整项目的场景,这一步通常可以跳过,但要确保 package.json 已经准备好。

安装依赖并配置环境变量

项目初始化后,下一步是安装依赖。原文以 Express 和 body-parser 为例,命令应保留原有依赖信息:

Node.js 项目在 Ubuntu 上从初始化到本机运行的步骤流程图
本机可运行前的关键链路用流程图梳理环境安装、目录创建、依赖安装和环境变量加载之间的先后关系。
npm install express body-parser --save

其中 --save 的作用是把依赖写入 package.json,这样服务迁移或重新部署时,只需要执行一次安装命令就能恢复依赖环境。

如果项目要区分开发环境和生产环境,环境变量也应该尽早接入。原文推荐使用 dotenv:

npm install dotenv --save

然后在项目根目录创建 .env 文件,例如:

PORT=3000
NODE_ENV=production

应用入口文件里加载这些配置,示例代码如下:

require('dotenv').config();
const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json());

app.get('/', (req, res) => {
  res.send('Hello World!');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

这样端口号等配置就不需要硬编码在代码里,部署到不同环境时也更容易调整。对上线环境来说,这一步的价值不只是“方便”,更是后续维护时减少配置混乱的基础。

启动应用并验证服务

配置完成后,可以先直接启动应用,确认项目本身没有运行错误。原文使用的是 npm 脚本方式:

npm start

这要求你的 package.json 中已经定义好了 start 脚本。如果脚本存在,服务启动后可以在本机上用 curl 做一次简单检查:

curl http://localhost:3000

如果返回的是 Hello World!,说明应用已经在 3000 端口正常监听。到这一步,只能证明“程序能跑”,还不能说明它适合生产环境持续运行,因为终端一关闭,进程通常也会跟着退出。

用 PM2 管理 Node.js 进程

生产环境通常不会直接手动挂着一个 npm start 进程。更稳妥的做法是交给 PM2 管理,它可以负责守护、重启、查看状态以及配合系统开机自启。

原文给出的常用命令如下:

# 安装PM2
sudo npm install pm2 -g
# 启动应用
pm2 start app.js --name my-nodejs-app
# 查看应用状态
pm2 status
# 停止应用
pm2 stop my-nodejs-app
# 重启应用
pm2 restart my-nodejs-app
# 删除应用
pm2 delete my-nodejs-app

这里的关键点有两个。第一,给进程命名为 my-nodejs-app 后,后续维护会清晰很多;第二,PM2 解决的是“服务常驻”问题,而不是对外访问问题。

原文还提到可以执行 pm2 startup 来设置开机自启。这样服务器重启后,PM2 会通过对应的 systemd 服务把你的 Node.js 应用重新拉起,避免机器重启后服务忘记恢复。

配置 Nginx 反向代理并接入域名

当应用已经在本机端口上稳定运行后,最后一步就是让外部请求通过域名访问它。原文建议不要直接让 Node.js 去监听 80 端口,而是由 Nginx 作为前置反向代理,这也是更常见的线上部署方式。

PM2 与 Nginx 在生产部署中的分工关系图
生产部署中的三层分工这张图突出线上部署里三层职责:Node.js 处理业务、PM2 保证进程常驻、Nginx。

先安装 Nginx 并创建站点配置文件:

# 安装Nginx
sudo apt-get install nginx -y
# 配置Nginx
sudo nano /etc/nginx/sites-available/my-nodejs-app

配置内容示例如下:

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        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_cache_bypass $http_upgrade;
    }
}

这段配置的核心作用,是把访问 yourdomain.com 的请求转发到本机 3000 端口,也就是前面由 Node.js 应用监听的地址。

保存后,再启用配置并检查语法:

sudo ln -s /etc/nginx/sites-available/my-nodejs-app /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

如果 sudo nginx -t 检查通过,Nginx 重启成功,那么只要域名已经正确解析到这台 Ubuntu 服务器,对外访问时就会先到 Nginx,再由它转发给 Node.js 服务。

从部署逻辑上看,这一步补上的是“入口层”:Node.js 负责业务处理,PM2 负责进程存活,Nginx 负责对外接入和转发,三者配合后,才算形成一个基本可用的生产部署框架。

部署时最该确认的几件事

把整套流程压缩来看,Ubuntu 上部署 Node.js 项目至少要确认四件事:Node.js 16 和 npm 已安装、项目依赖完整且能本机启动、PM2 已接管进程、Nginx 已把域名请求转发到应用端口。只完成前两步,服务通常还只是“能运行”;把 PM2 和 Nginx 配好,才更接近一个可持续维护的线上服务。

如果你的项目后续还要接数据库、日志系统或 HTTPS 证书,可以在这套基础上继续扩展。但对于大多数刚上线的 Node.js 服务来说,先把这条最小可用部署链路走通,比一开始追求复杂架构更重要。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。