很多人第一次把 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 为例,命令应保留原有依赖信息:

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 作为前置反向代理,这也是更常见的线上部署方式。

先安装 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 服务来说,先把这条最小可用部署链路走通,比一开始追求复杂架构更重要。













