如何在Ubuntu上部署Express REST API?

来源:站长联盟作者:白鲨头衔:草根站长
导读:本期聚焦于白鲨创作的《如何在Ubuntu上部署Express REST API?》,敬请观看详情。把Express REST API部署到Ubuntu服务器,最怕遇到进程莫名退出、端口被占用和反向代理配置错误。本文从一台全新Ubuntu系统开始,逐步演示安装Node.js运行时、创建基础的REST接口、使用PM2守护Node进程,并通过Nginx将外部请求转发到Express应用。除了基本部署流程,还会说明如何设置防火墙规则、管理环境变量以及查看日志排查启动失败。按照文中步骤操作,你可以把本地开发好的接口服务稳定地运行在云主机上,避免手工启动带来的停机风险。整个过程使用命令行完成,适合有一定Linux基础的后端开发者参考。文中涉及的命令均已在Ubuntu 22.04上验证通过,其他版本操作类似。

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

如何在Ubuntu上部署Express REST API?

一、准备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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。