CentOS 下部署 Node.js 项目:从环境安装到 PM2、Nginx 与 HTTPS 上线

Alice
Alice
发布时间:2026-08-23| 113人浏览过
原创

前言

在 CentOS 上部署 Node.js 项目,看起来只是装环境、传代码、起进程几步,但真正容易出问题的往往是版本、端口、进程托管和反向代理之间的衔接。本文按实际上线顺序整理出一套可直接执行的流程,并在每一步补上作用说明和验证方法,方便你判断项目到底卡在安装、访问链路,还是运行维护层。

在 CentOS 上部署 Node.js 项目,难点通常不在某一条命令,而在于步骤之间是否衔接正确:Node.js 版本是否合适、端口是否放行、进程是否能托管、域名请求是否真正转发到了应用。下面按上线顺序把整套流程重新梳理一遍,保留原有命令和配置,并补出每一步该检查什么,方便你从“能启动”走到“能稳定对外提供服务”。

先完成系统准备

正式部署前,先更新系统并安装常用基础工具。这里的 wget 和 git 分别用于下载资源和拉取代码,属于后续步骤会直接用到的基础依赖。

sudo yum update -y
sudo yum install -y wget git

这一步做完后,至少要确认两件事:系统软件包已更新,后续拉取项目代码时不会再缺少 git。

安装 Node.js 与 npm

如果项目没有特殊版本要求,可以按原文做法通过 NodeSource 仓库安装 Node.js 18.x。这一版本对大多数常见项目都够用,同时也便于后续直接获得对应的 npm。

curl -sL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs
# 验证安装
node -v
# 应输出v18.x.x
npm -v 
# 应输出对应版本

这里的关键不是“装完就算结束”,而是确认版本输出正常。只有 node -v 和 npm -v 都返回预期结果,后面的依赖安装和进程托管才有基础。

放行 HTTP 与 HTTPS 端口

如果服务器启用了防火墙,必须提前开放 Web 访问所需端口。原文给出的做法是放行 80 和 443,分别对应 HTTP 与 HTTPS。

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

这一步的作用很直接:不放行端口,即使应用本身已经启动,外部访问也进不来。尤其在后面启用 Nginx 和 SSL 后,这两个端口会成为标准入口。

把项目部署到服务器

项目上线前,先把代码放到目标目录。原文提供了两种方式:通过 Git 克隆,或者手动上传。若项目本身已经使用 Git 管理,优先选择克隆方式,后续更新更省事。

方式一:通过 Git 克隆项目

推荐把项目放到固定目录,例如 /var/www/myapp,便于后续统一管理。

mkdir -p /var/www/myapp && cd /var/www/myapp
git clone <your_project_repo_url> .
# 克隆项目到当前目录

方式二:手动上传项目

如果代码不方便直接从仓库拉取,也可以先在本地打包,再通过 scp 上传到服务器。

scp -r /local/project/path user@server_ip:/var/www/myapp
cd /var/www/myapp

无论使用哪种方式,做完后都应确认项目目录中已经存在 package.json 和实际入口文件,否则下一步依赖安装或 PM2 启动都会失败。

只安装生产环境依赖

进入项目目录后,根据 package.json 安装依赖。这里的重点是生产环境部署通常不需要 devDependencies,省掉这部分可以减少安装体积和不必要的依赖风险。

npm install --production
# 或使用yarn(需提前安装:sudo npm install -g yarn)
yarn install --production

如果你的项目明确依赖某个包管理器,就按项目原本约定执行;不要混用安装方式,否则可能出现锁文件不一致、线上依赖版本漂移等问题。

用 PM2 托管 Node.js 进程

Node.js 项目如果直接用 node app.js 启动,一旦终端断开或进程崩溃,服务就会中断。PM2 的价值就在这里:后台运行、异常自动重启、进程列表持久化,以及开机自启动。

展示 PM2 托管 Node.js 应用时需要关注的启动、持久化和自启动关系图
PM2 托管的 4 个关键点把应用交给 PM2 后,重点不是单次启动,而是进程能否持续在线、重启后能否自动恢复。
sudo npm install -g pm2
# 全局安装PM2
pm2 start app.js --name "my-node-app"
# 启动应用(app.js为入口文件,按项目实际修改)
pm2 sa ve 
# 保存当前进程列表
pm2 startup
# 生成开机自启动脚本(按提示执行生成的命令,如`sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u root --hp /root`)

这里有三个检查点最重要:

  • 入口文件是否真的是 app.js,如果项目入口不同,需要按实际修改。
  • pm2 save 是否执行成功,决定重启后能否恢复进程列表。
  • pm2 startup 输出的命令是否已按提示执行,否则不会真正写入系统自启动。

用 Nginx 做反向代理

Nginx 不是 Node.js 项目运行的前提,但在生产环境中通常值得加上。它可以接管 80/443 端口,对外暴露统一入口,再把请求转发到 Node.js 实际监听的应用端口,例如 3000。

展示 Nginx 反向代理和 HTTPS 配置时的请求流向与关键配置项
Nginx 转发与 HTTPS 关系图Nginx 负责接住 80/443 入口,再把请求转发到本地 Node.js 端口。
sudo yum install -y nginx
# 安装Nginx
# 配置反向袋里(编辑默认配置或新建站点配置)
sudo vi /etc/nginx/conf.d/myapp.conf

配置文件可按下面内容填写,将 your_domain.com 替换成你的域名或 IP,把 3000 改成应用真实端口:

server {
    listen 80;
    server_name your_domain.com;
    location / {
        proxy_pass http://localhost:3000;
        # 转发到Node.js应用
        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;
    }
}

配置完成后,重启并设置 Nginx 开机自启:

sudo systemctl restart nginx
sudo systemctl enable nginx
# 开机自启动

这一层配置的判断标准很明确:用户访问域名后,请求应先到 Nginx,再由 Nginx 转发到本地 Node.js 端口。若域名打不开、返回 502 或始终访问不到应用,问题通常就出在这里或 PM2 进程本身。

补上 HTTPS 证书

如果项目准备正式对外提供服务,建议继续配置 SSL。原文采用的是 Let's Encrypt 和 Certbot,这也是 CentOS 上较常见的一套免费 HTTPS 方案。

sudo yum install -y certbot python3-certbot-nginx
# 安装Certbot
sudo certbot --nginx -d your_domain.com
# 自动配置Nginx HTTPS
# 按提示完成证书申请(需验证域名所有权)
# 证书自动续期(Certbot会添加cron任务)

要注意的是,证书申请依赖域名解析已经正确指向服务器,而且外部可访问 80 端口。否则即使 Certbot 已安装,也无法完成域名所有权验证。

上线后怎么验证部署成功

部署完成后,不要只看命令有没有报错,更要做最基础的上线核验。原文给出的检查点可以直接沿用:

  • 访问 http://your_domain.com(或 https://your_domain.com),确认应用正常运行。
  • 查看 PM2 进程状态:pm2 list(应显示应用为 online)。
  • 查看应用日志:pm2 logs my-node-app(排查启动或运行错误)。

如果页面无法打开,可以按顺序排查:Node.js 应用是否在监听端口、PM2 进程是否在线、Nginx 是否成功转发、80/443 是否已放行、域名是否正确解析到服务器。把这些点串起来看,部署问题通常都能比较快定位。

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

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 算法库。