使用阿里云ECS部署Express

这篇笔记📒,记录第一次使用阿里云ECS,部署Express应用的过程,还有踩的一些坑。主要步骤如下:

  1. 新服务器初始化配置(安装git curl wget vim)
  2. 安装 Node.js 与 npm
  3. 上传/克隆你的 Express 项目代码
  4. 运行 Express 服务
  5. 使用 PM2 守护进程
  6. 配置防火墙与安全组
  7. 开放阿里云安全组(公网入口)

买了一个阿里云ECS e实例(2核2G),用的操作系统是Alibaba Cloud Linux 4 LTS 64位

为什么用Alibaba Cloud Linux 4 LTS 64操作系统

刚开始我用的操作系统是CentOS 7.9版本, 但是CentOS 7.9自带的 Node版本我觉得太旧了,然后安装 Node.js 20, 提示需要glibc >= 2.28,CentOS 7.9用的glibc是2.17,在这个系统升级不了Node,

Requires: libstdc++.so.6(GLIBCXX_3.4.20)(64bit) Error: Package: 2:nodejs-20.19.5-1nodesource.x86_64 (nodesource-nodejs) Requires: glibc >= 2.28 Installed: glibc-2.17-326.el7_9.3.x86_64 (@updates)

即使我在CentOS 7.9里安装nvm, 使用nvm安装node 20, 还是会报错。所以我就切换到Alibaba Cloud Linux 4 LTS 64位

nvm 只是切换 Node 版本的工具,它不会自己提供新的 glibc。

所以 Node.js 20 在 CentOS 7上无法直接运行二进制版本

进入服务区控制台,服务器初始化配置

提示我们进行安全更新, 仅更新系统中与安全相关的最小必要软件包的命令,主要用于在保持系统稳定性的同时,快速修复已知安全漏洞。

执行如下命令进行安全更新

css 复制代码
dnf upgrade-minimal --security

执行如下命令确保系统基础组件处于最新状态,修复已知漏洞并提升兼容性。

bash 复制代码
sudo dnf update -y # AL4 用 dnf(yum 别名也行)

运行后,系统会从配置的软件源(如阿里云官方源)检查所有已安装包的最新版本,下载并升级它们,最终完成系统整体更新。

执行如下命令,安装基础工具 git curl wget vim

复制代码
sudo dnf install -y git curl wget vim

待安装的软件包(均为开发和日常操作的基础工具):

  • git:分布式版本控制系统,用于克隆代码仓库(如从 GitHub、GitLab 拉取项目代码)、管理代码版本。
  • curl :命令行网络传输工具,支持 HTTP/HTTPS/FTP 等协议,常用于下载文件、测试接口(如 curl example.com)。
  • wget :另一个命令行下载工具,擅长断点续传和后台下载(如 wget example.com/file.zip)。
  • vim:功能强大的文本编辑器,用于修改配置文件(如 Nginx 配置、脚本文件等),是 Linux 系统中最常用的编辑器之一。
安装 Node.js 20(LTS 版)

用 NVM(Node Version Manager)安装,便于多版本管理。官方推荐,避免仓库冲突。 执行如下命令安装nvm, 用nvm安装node20

bash 复制代码
# 安装 NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc  # 加载 NVM

# 安装 Node 20
nvm install 20
nvm use 20
nvm alias default 20  # 默认用 20

# 验证
node -v  # 应输出 v20.x.x
npm -v   # 应输出 10.x.x

我们成功安装了node 20.19.5版本

上传/克隆你的 Express 项目代码

创建工作目录 /opt/myapp/

bash 复制代码
mkdir -p /opt/myapp/ && cd /opt/myapp/

先前我们安装了git, 我们可以直接克隆代码到服务器,因为阿里云ECS网络问题,我们把代码上传到Gitee上,就可以克隆代码

用 Git 克隆项目代码
bash 复制代码
git clone https://gitee.com/yourusername/your-express-repo.git
安装依赖并构建 TS 项目

执行npm i 后,一直没啥反应, 把npm 镜像换成淘宝镜像,就可以成功安装了

bash 复制代码
npm config set registry https://registry.npmmirror.com

执行npm i --no-optional --verbose 不安装那些可选的包,--verbose就可以显示安装的详细信息

安装pm2, 使用pm2启动应用

运行npm run build, 打包, 然后控制台执行

bash 复制代码
npm i -g pm2 && pm2 start dist/app.js --name "api"

这里我们安装了pm2, pm2 是 Node.js 应用的进程管理工具,在服务器部署场景中非常重要,主要解决以下问题:

  • 防止进程意外退出:直接用 node dist/app.js 启动的话,一旦程序报错或服务器临时波动,进程会直接终止,导致服务中断。pm2 会自动监控进程,崩溃后立即重启,保证服务可用性。
  • 后台运行:通过 pm2 启动的进程会在后台运行,不会因终端关闭(比如你断开 SSH 连接)而停止(直接用 node 启动的话,关闭终端进程就没了)。
  • 资源监控与日志管理 :可以通过 pm2 monit 查看 CPU / 内存占用,用 pm2 logs api 快速查看该服务的日志,方便排查问题。
  • 多进程管理:如果你的 express 服务需要扩展性能,pm2 可以轻松启动多个进程(利用多核 CPU),提升并发处理能力。

--name "api" 是 PM2 的一个可选标志,用来给这个启动的 Node.js 进程(你的 Express app)起一个自定义名称(这里是 "api"), 起名的好处

管理操作:后续命令用名称操作更方便:

  • pm2 logs api:只看 "api" 进程的日志(不看所有)。
  • pm2 restart api:只重启 "api"(不影响其他进程)。
  • pm2 stop api / pm2 delete api:停止/删除特定进程。
  • pm2 monit:监控界面中,按名称过滤。

从 上面截图看,我们的Express应用已启动(ID 0,name "api",status online,占用 43MB 内存)。现在它在 ECS 服务器本地运行(fork 模式,PID 64131)。默认 Express app 监听端口 3000

既然应用已经运行了,我们试着访问下

bash 复制代码
curl http://localhost:3000/

可以看到输出了Transaction API is running...,我的代码就是这样写的

javascript 复制代码
app.get('/', (req, res) => {
  res.send('Transaction API is running...')
})

说明本地部署成功了,服务器内部可以访问

配置防火墙与安全组
css 复制代码
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports  # 确认添加

报错了FirewallD is not running,这是阿里云 AL4(基于 RHEL 9)的常见情况:firewalld 默认安装但未启动(安全考虑,初始状态关闭),我们要激活它,然后开放端口 3000(你的 Express app 端口)。完成后,再检查阿里云安全组(控制台配置),因为 ECS 防火墙只管本地,安全组管公网。

执行如下命令安装firewalld

bash 复制代码
sudo dnf install -y firewalld

执行如下命令启动firewalld,并设置开机启动

bash 复制代码
sudo systemctl start firewalld   # 立即启动
sudo systemctl enable firewalld  # 开机自启
sudo systemctl status firewalld  # 检查状态,应显示 "active (running)"

再次运行添加firewalld

css 复制代码
sudo firewall-cmd --permanent --add-port=3000/tcp

我们用浏览器访问下我们的公网IP,发现还是不行,因为防火墙只管 ECS 内部,安全组管进出流量,我们要配置安全组

开放阿里云安全组(公网入口)

在控制台网络与安全组

添加入方向规则

我的访问配置,0.0.0.0/0,这样就可以任何地方都访问了,暂时不加限制, ECS有限制不同网络访问,访问你的服务器能力

这样再访问,浏览器就可以访问了

小结:整个过程还是挺简单的,虽然一些工具是第一次用,比如pm2,但是需要一点linux基础,去操作系统。再次总结下流程

  1. 新服务器初始化配置(安装git curl wget vim node)
  2. 上传/克隆你的 Express 项目代码 安装依赖 打包 运行
  3. 使用 PM2 守护进程
  4. 配置防火墙与安全组
  5. 开放阿里云安全组(公网入口)
相关推荐
程序员爱钓鱼24 分钟前
Node.js 编程实战:路由处理原理与实践
后端·node.js·trae
Lucky_Turtle37 分钟前
【Node】npm install报错npm error Cannot read properties of null (reading ‘matches‘)
前端·npm·node.js
hhzz1 小时前
Spring Boot整合Activiti的项目中实现抄送功能
java·spring boot·后端
Victor3563 小时前
Netty(7)如何实现基于Netty的TCP客户端和服务器?
后端
Victor3563 小时前
Netty(8)什么是Netty的ChannelPipeline和ChannelHandler?
后端
乘风!4 小时前
NSSM启动tomcat部署Java程序
java·服务器·后端·tomcat
代码无疆4 小时前
学点java字节码更易于理解一些特殊的java语法效果
java·后端
星浩AI5 小时前
AI 并不懂文字,它只认向量:一文搞懂 Embedding
后端
程序员博博5 小时前
这才是vibe coding正确的打开方式 - 手把手教你开发一个MCP服务
javascript·人工智能·后端
聊天QQ:276998855 小时前
基于线性自抗扰(LADRC)的无人船航向控制系统Simulink/Matlab仿真工程探索
node.js