部署Express REST API到Ubuntu服务器并不是简单地把代码上传后执行npm start,而是需要考虑进程守护、反向代理、日志收集和安全策略。本文将按生产环境的常见要求,从零开始完成一个可对外提供服务的REST API部署,所有操作均在Ubuntu 22.04 LTS系统上完成。如果你已经有一个开发好的Express项目,也可以跳过创建项目部分,直接参考PM2和Nginx的配置。

一、准备Ubuntu服务器与安装Node.js
Ubuntu官方软件源中自带的Node.js版本通常比较旧,对于Express应用来说,建议使用NodeSource提供的较新版本,以便获得更好的性能和安全性。首先更新系统包索引,然后安装curl工具用于下载NodeSource的安装脚本。
sudo apt update sudo apt install -y curl curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejs node -v npm -v
上面的命令会安装Node.js 20.x版本,这是目前较为稳定的长期支持版本。安装完成后,使用node -v和npm -v可以查看版本号,如果输出类似v20.11.0和10.2.4的信息,说明Node环境已经就绪。需要注意的是,如果服务器上已经安装了旧版Node.js,建议先卸载或使用nvm管理多版本,避免路径冲突。
接下来为部署创建一个专门的目录,例如/var/www/express-api,并将项目文件放置在该目录下。这样可以和系统其他文件隔离,也方便后续设置权限和备份。
二、创建Express REST API应用
如果你还没有现成的项目,可以在服务器上直接初始化一个简单的Express应用。首先进入项目目录,使用npm init生成package.json文件,然后安装express依赖。为了便于演示,这里创建一个包含GET和POST两个基本路由的REST API。
const express = require('express');
const app = express();
app.use(express.json());
app.get('/', (req, res) => {
res.json({ message: 'API is running' });
});
app.post('/items', (req, res) => {
const item = req.body;
res.status(201).json({ id: 1, ...item });
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
这段代码定义了两个接口:GET / 用于健康检查,POST /items 接收JSON数据并返回创建结果。使用环境变量PORT可以让应用在不同环境中灵活指定监听端口,默认使用3000端口。app.use(express.json())中间件负责解析请求体中的JSON数据,这是REST API处理POST请求时的常见配置。
将代码保存为app.js后,可以先在终端运行node app.js进行本地测试。如果看到Server listening on port 3000的输出,说明应用启动成功。此时可以用curl命令验证接口:curl http://127.0.0.1:3000/ 应该返回JSON响应。测试完成后按Ctrl+C停止进程,接下来进入生产环境部署环节。
三、使用PM2守护Node进程
直接使用node app.js启动的应用会占用当前终端,一旦SSH连接断开或终端关闭,进程就会停止。生产环境中需要一种方式让Node进程在后台持续运行,并在异常退出后自动重启。PM2是Node.js生态中最常用的进程管理工具,它支持日志管理、负载均衡和开机自启。
sudo npm install -g pm2 pm2 start app.js --name express-api pm2 save pm2 startup systemd pm2 status pm2 logs express-api
安装PM2后,使用pm2 start命令启动应用,--name参数指定进程名称,方便后续管理。pm2 save会保存当前进程列表,pm2 startup systemd会生成并启用开机自启脚本,确保服务器重启后应用自动恢复运行。pm2 status可以查看所有托管进程的状态,pm2 logs则用于实时查看应用日志。
PM2还提供了内存阈值自动重启、集群模式扩展多进程等功能。对于大多数中小型REST API,单进程模式已经足够。如果需要利用多核CPU,可以使用pm2 start app.js -i max启动集群模式,但这要求应用无状态,并且需要额外配置会话共享。
四、配置Nginx反向代理与防火墙
虽然Express应用可以直接监听80端口,但在生产环境中更常见的做法是让Nginx监听80和443端口,然后将请求反向代理到Node应用的高端口(如3000)。这样做的好处包括:可以托管静态文件、配置HTTPS证书、做负载均衡和限流。首先安装Nginx。
sudo apt install -y nginx sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' sudo ufw enable
安装完成后,在/etc/nginx/sites-available/目录下创建一个新的配置文件,例如express-api,内容如下。然后通过软链接启用站点,并测试配置是否正确。
server {
listen 80;
server_name your_domain_or_ip;
location / {
proxy_pass http://127.0.0.1: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;
}
}
配置中的server_name需要替换为你的域名或服务器公网IP。proxy_pass指定了Node应用的地址和端口,proxy_set_header用于传递原始请求头,确保Express能正确获取客户端IP和协议信息。保存文件后,使用sudo ln -s /etc/nginx/sites-available/express-api /etc/nginx/sites-enabled/ 启用站点,然后运行sudo nginx -t检查语法,最后sudo systemctl reload nginx使配置生效。
防火墙规则中,OpenSSH允许SSH登录,Nginx Full同时开放80和443端口。如果不需要HTTPS,可以只使用Nginx HTTP。完成后在浏览器访问服务器IP,应该能看到API返回的JSON数据。
五、常见问题排查与安全建议
部署后可能遇到应用无法访问或进程意外退出等问题,下面列出几个常见原因和解决方法。端口占用:如果3000端口已被其他程序占用,可以使用sudo lsof -i :3000查看占用进程,然后修改应用的PORT环境变量或结束占用进程。权限问题:如果PM2启动应用时提示权限不足,检查项目目录的所有者是否为当前用户,可以使用sudo chown -R $USER:$USER /var/www/express-api修复。
环境变量管理:生产环境中的数据库密码、API密钥等敏感信息不应硬编码在代码中,可以通过PM2的配置文件或服务器环境变量注入。使用pm2 start app.js --env production可以加载.env文件,但需要先安装dotenv依赖。日志分析:当应用出现500错误时,使用pm2 logs express-api查看错误堆栈是最直接的排查方式。PM2日志默认存放在~/.pm2/logs目录下,可以定期清理或配置日志轮转。
最后,保持系统和依赖更新是安全运行的基础。定期执行sudo apt update && sudo apt upgrade更新系统包,使用npm audit检查项目依赖漏洞,并关注Express和Node.js的安全公告。如果API对公网开放,建议配置HTTPS证书并设置请求速率限制。
Ubuntu部署Express REST APIPM2修改时间:2026-08-24 02:37:57