Rocky Linux 9 + VMware + Node.js + Nginx 从零部署教程

Rocky Linux 9 + VMware + Node.js + Nginx 从零部署教程

目标:把一台全新的 Windows 电脑上的 VMware 虚拟机,从"什么都没有"搭建成一台可以部署 Node.js 后端服务和网页的 Linux 服务器。

本教程默认使用 Rocky Linux 9.x Minimal + VMware Workstation + Node.js 24 LTS + Nginx + PM2

操作习惯尽量保持 CentOS 风格,yumsystemctlfirewall-cmd 等命令仍然可以继续使用。


0. 最终会得到什么

完成本教程后,服务器结构大致如下:

text 复制代码
Windows / 浏览器
        │
        │  SSH :22
        │  HTTP :80
        │  HTTPS :443
        ▼
┌────────────────────────────┐
│ Rocky Linux 9              │
│                            │
│  Nginx :80 / :443          │
│      │                     │
│      ├── 静态网页           │
│      │   Vue / React / HTML │
│      │                     │
│      └── /api              │
│           │                │
│           ▼                │
│       Node.js :3000        │
│           │                │
│          PM2               │
└────────────────────────────┘

建议最终环境:

text 复制代码
Rocky Linux 9.x Minimal
Node.js 24 LTS
npm
pnpm
PM2
Nginx
Git
OpenSSH
firewalld

说明:本文为了降低第一次部署的复杂度,命令默认可以直接用 root 执行。

真正公网生产服务器建议后续创建普通部署用户,不长期用 root 运行 Node.js 服务。


第一部分:下载 Rocky Linux

1. 为什么不用 CentOS 7

CentOS 7 已经结束生命周期,不再正常提供官方安全更新和标准软件源。

新服务器不建议再安装:

text 复制代码
CentOS 7
CentOS Linux 8

如果习惯以前的 CentOS / RHEL 操作方式,推荐:

text 复制代码
Rocky Linux 9

Rocky Linux 与传统 CentOS 的操作习惯非常接近:

bash 复制代码
yum install nginx
rpm -qa
systemctl status nginx
firewall-cmd --list-all
vi /etc/nginx/nginx.conf

这些仍然可以继续使用。


2. 下载哪个版本

推荐:

text 复制代码
Rocky Linux 9.x
x86_64
Minimal ISO

当前教程编写时(2026-08)Rocky Linux 9 最新小版本为 9.8。

推荐下载文件:

text 复制代码
Rocky-9-latest-x86_64-minimal.iso

或者明确版本:

text 复制代码
Rocky-9.8-x86_64-minimal.iso

官方地址:

如果官方下载慢,可以选择可信的国内高校镜像站下载 Rocky Linux 9 的 Minimal ISO。

不建议选择

text 复制代码
boot.iso

因为它安装过程中需要大量在线下载。

也没有必要下载:

text 复制代码
dvd.iso

它体积很大,对普通 Node.js Web 服务器来说没有必要。


第二部分:创建 VMware 虚拟机

3. 新建虚拟机

打开 VMware Workstation:

text 复制代码
文件
→ 新建虚拟机
→ 典型(推荐)

加载刚刚下载的:

text 复制代码
Rocky-9.x-x86_64-minimal.iso

4. VMware 没有 Rocky Linux 怎么选

如果 VMware 较新,优先选择:

text 复制代码
Linux
→ Red Hat Enterprise Linux 9 64-bit

如果 VMware 比较旧,没有 Rocky / RHEL 9,可以选择:

text 复制代码
Linux
→ CentOS 7 64 位

这个选项主要用于 VMware 预设虚拟硬件,并不代表虚拟机里真的只能安装 CentOS 7。


5. 推荐虚拟机配置

学习、开发和普通 Node.js 服务:

text 复制代码
CPU:2 核
内存:4 GB
硬盘:50 GB
网络:NAT

如果以后同时运行:

text 复制代码
Node.js
Nginx
MySQL
Redis
Docker

宿主机资源允许的话,可以调整为:

text 复制代码
CPU:4 核
内存:8 GB
硬盘:60 GB+

6. 网络模式怎么选

推荐:NAT

第一次部署推荐:

text 复制代码
NAT

结构:

text 复制代码
互联网
   │
Windows 宿主机
   │
VMware NAT
   │
Rocky Linux

优点:

  • 虚拟机可以访问互联网
  • Windows 宿主机可以 SSH 连接虚拟机
  • 配置简单
  • 很适合学习和本地开发

桥接模式

如果希望局域网里的其他电脑直接访问虚拟机,可以考虑桥接:

text 复制代码
路由器
 ├── Windows
 ├── 手机
 └── Rocky Linux 虚拟机

第一次部署建议先使用 NAT。


第三部分:安装 Rocky Linux

7. 启动安装

启动虚拟机后选择:

text 复制代码
Install Rocky Linux 9.x

安装程序本身是图形化界面,这是正常的。

即使最终安装的是纯命令行服务器,安装阶段仍然可以看到鼠标、按钮和安装选项。


8. 软件安装类型

如果出现:

text 复制代码
Software Selection

选择:

text 复制代码
Minimal Install

不要选择:

text 复制代码
Server with GUI
Workstation

Node.js 服务器一般不需要图形桌面。

Minimal 的优点:

  • 占用资源少
  • 后台服务少
  • 更接近云服务器
  • 攻击面更小
  • 更适合 Node.js / Nginx

9. 磁盘

进入:

text 复制代码
Installation Destination

第一次安装可以直接使用:

text 复制代码
Automatic Partitioning

即自动分区。


10. 网络

进入:

text 复制代码
Network & Host Name

确保网卡已经开启。

通常网卡名称为:

text 复制代码
ens33

安装完成以后 Rocky Linux 9 默认使用 NetworkManager 管理网络,一般会自动通过 DHCP 获取 IP。


11. 设置 root 密码

设置一个 root 密码。

本地 VMware 学习环境可以直接使用 root 管理。

公网生产服务器建议以后创建普通管理员用户,并使用 SSH Key 登录。


12. 完成安装

点击:

text 复制代码
Begin Installation

安装完成后:

text 复制代码
Reboot System

如果 VMware 仍然从 ISO 启动,需要断开虚拟光驱中的 ISO。

正常启动后会看到:

text 复制代码
Rocky Linux 9.x

localhost login:

登录:

text 复制代码
login: root
Password: ********

成功后:

bash 复制代码
[root@localhost ~]#

说明系统安装完成。


第四部分:检查网络

13. 查看 IP

执行:

bash 复制代码
ip addr

简写:

bash 复制代码
ip a

通常会看到:

text 复制代码
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP>
    inet 192.168.xxx.xxx/24

例如:

text 复制代码
inet 192.168.190.131/24

那么:

text 复制代码
192.168.190.131

就是当前虚拟机的 IPv4 地址。

也可以:

bash 复制代码
hostname -I

14. 检查默认路由

bash 复制代码
ip route

应该存在类似:

text 复制代码
default via 192.168.xxx.2 dev ens33

15. 测试互联网

bash 复制代码
ping -c 3 8.8.8.8

再测试 DNS:

bash 复制代码
ping -c 3 www.baidu.com

两者都正常,说明网络已经可用。


第五部分:配置 SSH

16. 查看 SSH 服务

执行:

bash 复制代码
systemctl status sshd

如果显示:

text 复制代码
Active: active (running)

说明 SSH 已经启动。

如果没有启动:

bash 复制代码
systemctl enable --now sshd

17. 查看 SSH 端口

bash 复制代码
ss -lntp | grep :22

正常会看到:

text 复制代码
LISTEN ... 0.0.0.0:22

18. 开放 SSH 防火墙

查看:

bash 复制代码
firewall-cmd --list-services

如果没有 ssh

bash 复制代码
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload

19. Windows SSH 连接

假设服务器 IP:

text 复制代码
192.168.190.131

Windows PowerShell:

bash 复制代码
ssh root@192.168.190.131

第一次可能出现:

text 复制代码
Are you sure you want to continue connecting?

输入:

text 复制代码
yes

再输入 Linux 密码。

成功后就可以不再一直使用 VMware 控制台,而通过 SSH 管理服务器。


第六部分:系统初始化

20. 更新系统

bash 复制代码
yum update -y

Rocky Linux 9 实际底层使用 dnf,所以也可以:

bash 复制代码
dnf update -y

为了保持 CentOS 使用习惯,本教程主要使用 yum


21. 安装基础工具

Minimal 系统很多工具默认没有安装。

一次安装常用工具:

bash 复制代码
yum install -y \
  curl \
  wget \
  git \
  vim \
  tar \
  xz \
  unzip \
  zip

这里的:

text 复制代码
tar
xz

很重要。

NVM 下载 Node.js 后需要解压,如果没安装 tar,可能出现:

text 复制代码
-bash: tar: 未找到命令
nvm: install failed

第七部分:安装 NVM

22. 为什么使用 NVM

不建议直接把 Node.js 版本绑死在系统 yum 包上。

使用 NVM 可以:

text 复制代码
安装多个 Node 版本
切换 Node 版本
升级 Node
设置默认 Node 版本

例如:

bash 复制代码
nvm install 24
nvm use 24
nvm install 22
nvm use 22

23. 安装 NVM

当前教程使用 NVM 0.40.3。

普通官方安装方式:

bash 复制代码
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

但是某些网络环境访问 GitHub git clone 不稳定,可能出现:

text 复制代码
RPC failed
HTTP/2 stream was not closed cleanly
Connection reset by peer
Failed to clone nvm repo

为了减少这个问题,推荐直接使用 script 模式:

bash 复制代码
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | METHOD=script bash

安装完成后:

bash 复制代码
source ~/.bashrc

检查:

bash 复制代码
command -v nvm

应该输出:

text 复制代码
nvm

再执行:

bash 复制代码
nvm --version

例如:

text 复制代码
0.40.3

24. NVM 安装失败排查

情况 1:nvm: command not found

检查:

bash 复制代码
ls -la ~/.nvm

如果目录存在:

bash 复制代码
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

然后:

bash 复制代码
nvm --version

情况 2:GitHub clone HTTP/2 报错

可以先尝试:

bash 复制代码
git config --global http.version HTTP/1.1

或者直接使用前面推荐的:

bash 复制代码
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | METHOD=script bash

第八部分:安装 Node.js

25. 安装 Node.js 24 LTS

bash 复制代码
nvm install 24

设置默认版本:

bash 复制代码
nvm alias default 24

启用:

bash 复制代码
nvm use 24

检查:

bash 复制代码
node -v
npm -v

当前教程编写时 Node.js 24 属于 LTS 系列。


26. 查看 Node 安装位置

bash 复制代码
which node

使用 root + NVM 时通常类似:

text 复制代码
/root/.nvm/versions/node/v24.x.x/bin/node

NVM 是"按用户安装"的。

也就是说:

text 复制代码
root 的 NVM ≠ 普通用户的 NVM

以后如果创建 deploy 用户,需要在 deploy 用户下单独安装 NVM / Node。


第九部分:安装 pnpm 和 PM2

27. 安装

bash 复制代码
npm install -g pnpm pm2

检查:

bash 复制代码
pnpm -v
pm2 -v

28. PM2 是干什么的

直接运行:

bash 复制代码
node server.js

终端一关闭,Node 程序就会停止。

PM2 可以:

text 复制代码
后台运行 Node
服务异常自动重启
查看日志
管理多个 Node 服务
开机自动启动

常用命令:

bash 复制代码
pm2 list
pm2 status
pm2 logs
pm2 restart app-name
pm2 stop app-name
pm2 delete app-name

第十部分:安装 Nginx

29. 安装

bash 复制代码
yum install -y nginx

30. 启动并设置开机启动

bash 复制代码
systemctl enable --now nginx

检查:

bash 复制代码
systemctl status nginx

正常:

text 复制代码
Active: active (running)

31. 开放 HTTP / HTTPS

bash 复制代码
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

检查:

bash 复制代码
firewall-cmd --list-services

应该包含:

text 复制代码
ssh http https

32. 查看 Nginx 80 端口

bash 复制代码
ss -lntp | grep :80

33. 浏览器测试 Nginx

假设服务器 IP:

text 复制代码
192.168.190.131

Windows 浏览器访问:

text 复制代码
http://192.168.190.131

能看到 Nginx / Rocky 默认页面,就说明:

text 复制代码
Windows
   ↓
Rocky Linux :80
   ↓
Nginx

已经成功。


第十一部分:部署一个最简单的 Node.js 服务

34. 创建项目目录

bash 复制代码
mkdir -p /opt/node-demo
cd /opt/node-demo

35. 创建 server.js

bash 复制代码
vim server.js

内容:

js 复制代码
const http = require('http');

const host = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'application/json; charset=utf-8',
  });

  res.end(
    JSON.stringify({
      success: true,
      message: 'Node.js server is running',
      path: req.url,
    }),
  );
});

server.listen(port, host, () => {
  console.log(`Node server running at http://${host}:${port}`);
});

这里故意监听:

text 复制代码
127.0.0.1:3000

而不是:

text 复制代码
0.0.0.0:3000

因为正式部署时不需要把 Node 的 3000 端口暴露到公网。

只让 Nginx 从服务器内部访问即可。


36. 直接运行测试

bash 复制代码
node server.js

另外打开一个 SSH 终端:

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

正常会返回:

json 复制代码
{
  "success": true,
  "message": "Node.js server is running",
  "path": "/"
}

测试完成按:

text 复制代码
Ctrl + C

停止 Node。


第十二部分:使用 PM2 管理 Node

37. PM2 启动

bash 复制代码
cd /opt/node-demo
pm2 start server.js --name node-demo

查看:

bash 复制代码
pm2 list

日志:

bash 复制代码
pm2 logs node-demo

测试:

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

38. 保存 PM2 服务列表

bash 复制代码
pm2 save

39. PM2 开机自启

执行:

bash 复制代码
pm2 startup systemd

PM2 会输出一条需要你继续执行的命令。

把 PM2 输出的那条命令完整复制并执行,不要自己猜。

执行完成后:

bash 复制代码
pm2 save

验证:

bash 复制代码
reboot

服务器重新启动后:

bash 复制代码
pm2 list

确认 node-demo 仍然在线。


第十三部分:Nginx 反向代理 Node.js

40. 创建 Nginx 配置

bash 复制代码
vim /etc/nginx/conf.d/node-demo.conf

写入:

nginx 复制代码
server {
    listen 80;
    server_name _;

    location /api/ {
        proxy_pass http://127.0.0.1:3000/;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

41. Rocky Linux / SELinux 必做检查

Rocky Linux 默认启用 SELinux。

Nginx 反向代理 Node 时,如果浏览器出现:

text 复制代码
502 Bad Gateway

而 Node 服务实际上正常,很可能是 SELinux 不允许 Nginx 主动连接网络服务。

执行:

bash 复制代码
setsebool -P httpd_can_network_connect 1

这是 Rocky / RHEL 系部署 Nginx 反向代理时很重要的一步。


42. 检查 Nginx 配置

bash 复制代码
nginx -t

应该:

text 复制代码
syntax is ok
test is successful

然后:

bash 复制代码
systemctl reload nginx

43. 浏览器测试

假设 IP:

text 复制代码
192.168.190.131

浏览器访问:

text 复制代码
http://192.168.190.131/api/

应该可以看到 Node 返回的 JSON。

此时完整链路:

text 复制代码
浏览器
   │
   │ :80
   ▼
Nginx
   │
   │ /api
   ▼
127.0.0.1:3000
   │
   ▼
Node.js
   │
   ▼
PM2

Node 的 3000 端口不需要对外开放。


第十四部分:部署静态网页

44. 网页文件放哪里

Rocky Linux Nginx 默认静态目录通常可以使用:

text 复制代码
/usr/share/nginx/html

例如 Vue / React:

本地执行:

bash 复制代码
pnpm build

得到:

text 复制代码
dist/

dist 中的文件上传到:

text 复制代码
/usr/share/nginx/html/

45. Windows 使用 scp 上传

例如:

bash 复制代码
scp -r dist/* root@192.168.190.131:/usr/share/nginx/html/

然后浏览器:

text 复制代码
http://192.168.190.131

即可访问网页。


46. Vue / React History 路由

如果是 Vue Router / React Router history 模式,需要:

nginx 复制代码
location / {
    try_files $uri $uri/ /index.html;
}

完整示例:

nginx 复制代码
server {
    listen 80;
    server_name _;

    root /usr/share/nginx/html;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:3000/;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

配置后:

bash 复制代码
nginx -t
systemctl reload nginx

第十五部分:真实项目的推荐目录

以后可以约定:

text 复制代码
/opt/apps/
├── api/
│   ├── package.json
│   ├── src/
│   └── ...
│
└── other-node-service/

静态网页:

text 复制代码
/usr/share/nginx/html/

Nginx 配置:

text 复制代码
/etc/nginx/conf.d/

例如:

text 复制代码
/etc/nginx/conf.d/my-project.conf

第十六部分:Git 部署 Node 项目

47. 克隆代码

bash 复制代码
mkdir -p /opt/apps
cd /opt/apps
git clone <你的Git仓库地址>
cd <项目目录>

48. 安装依赖

pnpm:

bash 复制代码
pnpm install

或者 npm:

bash 复制代码
npm install

如果是 TypeScript / NestJS 等需要构建:

bash 复制代码
pnpm build

49. PM2 启动真实项目

项目如果启动入口:

text 复制代码
dist/main.js

可以:

bash 复制代码
pm2 start dist/main.js --name my-api

如果 package.json 有:

json 复制代码
{
  "scripts": {
    "start": "node dist/main.js"
  }
}

也可以:

bash 复制代码
pm2 start npm --name my-api -- start

最后:

bash 复制代码
pm2 save

第十七部分:常用服务器命令

50. 系统

bash 复制代码
# 系统版本
cat /etc/redhat-release

# 内核
uname -r

# IP
ip addr

# 路由
ip route

# 磁盘
df -h

# 内存
free -h

# CPU / 进程
top

51. 服务

bash 复制代码
systemctl status nginx
systemctl restart nginx
systemctl reload nginx
systemctl enable nginx

systemctl status sshd
systemctl restart sshd

52. 端口

bash 复制代码
ss -lntp

指定端口:

bash 复制代码
ss -lntp | grep :80
ss -lntp | grep :443
ss -lntp | grep :3000

53. Nginx

bash 复制代码
nginx -t

systemctl status nginx
systemctl reload nginx
systemctl restart nginx

nginx -v

主要配置:

text 复制代码
/etc/nginx/nginx.conf

项目配置:

text 复制代码
/etc/nginx/conf.d/*.conf

日志:

text 复制代码
/var/log/nginx/access.log
/var/log/nginx/error.log

查看:

bash 复制代码
tail -f /var/log/nginx/error.log

54. PM2

bash 复制代码
pm2 list
pm2 logs
pm2 logs my-api
pm2 restart my-api
pm2 stop my-api
pm2 delete my-api
pm2 save

55. Node

bash 复制代码
node -v
npm -v
pnpm -v

nvm list
nvm current

56. 防火墙

bash 复制代码
firewall-cmd --list-all
firewall-cmd --list-services
firewall-cmd --list-ports

开放端口:

bash 复制代码
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

删除端口:

bash 复制代码
firewall-cmd --permanent --remove-port=8080/tcp
firewall-cmd --reload

Node 通过 Nginx 代理时通常 不需要开放 3000

正常公网只需要:

text 复制代码
22     SSH
80     HTTP
443    HTTPS

第十八部分:排查顺序

如果网页访问不了,不要乱改配置,按照下面顺序排查。

57. 第一层:服务器 IP

bash 复制代码
ip addr

确认 IPv4 存在。


58. 第二层:Nginx 是否运行

bash 复制代码
systemctl status nginx

59. 第三层:80 是否监听

bash 复制代码
ss -lntp | grep :80

60. 第四层:防火墙

bash 复制代码
firewall-cmd --list-services

确保有:

text 复制代码
http
https

61. 第五层:Node 是否运行

bash 复制代码
pm2 list

以及:

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

如果本机 curl 都不通,问题在 Node,而不是 Nginx。


62. 第六层:Nginx 配置

bash 复制代码
nginx -t

然后:

bash 复制代码
tail -f /var/log/nginx/error.log

63. 第七层:SELinux

查看:

bash 复制代码
getenforce

如果:

text 复制代码
Enforcing

Nginx 代理 Node 返回 502,检查:

bash 复制代码
setsebool -P httpd_can_network_connect 1

不建议为了省事直接永久关闭 SELinux。


第十九部分:VMware IP 变化怎么办

NAT 模式一般通过 DHCP 分配 IP:

text 复制代码
192.168.xxx.xxx

虚拟机重启后 IP 有可能变化。

本地学习阶段,重新执行:

bash 复制代码
ip addr

查看新 IP 即可。

如果以后确实需要固定 IP,可以再使用 NetworkManager:

bash 复制代码
nmcli connection show
nmcli device status

根据 VMware NAT 所在网段设置静态 IP。

不要直接复制别人固定 IP 的命令,网关、DNS、网段必须以你自己的 VMware 网络为准。


第二十部分:迁移到阿里云 ECS

这套 VMware 环境以后可以基本原样迁移到阿里云。

建议阿里云系统也选择:

text 复制代码
Rocky Linux 9

这样:

text 复制代码
本地 VMware
Rocky Linux 9
Node 24
Nginx
PM2

与:

text 复制代码
阿里云 ECS
Rocky Linux 9
Node 24
Nginx
PM2

尽量保持一致。


64. 阿里云与 VMware 最大区别

VMware:

text 复制代码
Windows
  ↓
VMware NAT
  ↓
Rocky Linux

阿里云:

text 复制代码
互联网
   ↓
阿里云安全组
   ↓
ECS 公网 IP
   ↓
Rocky Linux firewalld
   ↓
Nginx
   ↓
Node.js

因此阿里云除了 Rocky Linux 自己的防火墙,还需要配置:

text 复制代码
阿里云安全组

至少通常需要:

text 复制代码
22   SSH
80   HTTP
443  HTTPS

不要把数据库和 Node 内部端口随便暴露到公网。


第二十一部分:生产服务器建议

真正公网服务器建议逐步做到:

text 复制代码
1. 不长期使用 root 跑 Node
2. 创建 deploy / app 用户
3. SSH 使用密钥登录
4. 限制 SSH 密码登录
5. Node 只监听 127.0.0.1
6. 外部流量统一经过 Nginx
7. 只开放 22 / 80 / 443
8. 配置 HTTPS
9. 定期更新 Rocky Linux 安全补丁
10. 做数据库和项目数据备份

例如创建普通用户:

bash 复制代码
useradd -m deploy
passwd deploy
usermod -aG wheel deploy

切换:

bash 复制代码
su - deploy

然后在该用户下安装自己的 NVM / Node / PM2。


第二十二部分:域名和 HTTPS(上线时)

正式服务器一般:

text 复制代码
域名
 ↓
DNS A记录
 ↓
阿里云公网IP
 ↓
Nginx :443
 ↓
Node.js

配置域名后,把 Nginx:

nginx 复制代码
server_name _;

换成:

nginx 复制代码
server_name example.com www.example.com;

HTTPS 可以使用可信 CA 证书或 Let's Encrypt。

完成后:

text 复制代码
https://example.com

访问服务器。


第二十三部分:完整安装速查

已经安装好 Rocky Linux 并 SSH 登录后,基础环境可以按以下顺序执行。

65. 基础工具

bash 复制代码
yum update -y

yum install -y \
  curl \
  wget \
  git \
  vim \
  tar \
  xz \
  unzip \
  zip

66. NVM

bash 复制代码
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | METHOD=script bash

source ~/.bashrc

nvm --version

67. Node.js

bash 复制代码
nvm install 24
nvm alias default 24
nvm use 24

node -v
npm -v

68. pnpm + PM2

bash 复制代码
npm install -g pnpm pm2

pnpm -v
pm2 -v

69. Nginx

bash 复制代码
yum install -y nginx

systemctl enable --now nginx

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

nginx -v
systemctl status nginx

70. SELinux 允许 Nginx 反代 Node

bash 复制代码
setsebool -P httpd_can_network_connect 1

71. 最终检查

bash 复制代码
cat /etc/redhat-release

ip addr

node -v
npm -v
pnpm -v
pm2 -v
nginx -v
git --version

systemctl status sshd
systemctl status nginx

firewall-cmd --list-services

第二十四部分:部署完成检查清单

第一次部署时,从上到下确认:

  • Rocky Linux 9.x Minimal 已安装
  • VMware 网络使用 NAT
  • ip addr 可以看到 IPv4
  • 可以访问互联网
  • SSH 服务正常
  • Windows 可以 SSH 登录
  • 基础工具已安装
  • NVM 已安装
  • Node.js 24 已安装
  • npm 正常
  • pnpm 正常
  • PM2 正常
  • Nginx 已安装
  • Nginx 已设置开机启动
  • 防火墙开放 SSH / HTTP / HTTPS
  • 浏览器可以访问 Nginx
  • Node 服务可以通过 127.0.0.1:3000 访问
  • Node 服务已经交给 PM2 管理
  • pm2 save 已执行
  • PM2 开机启动已配置
  • Nginx /api 已反向代理 Node
  • SELinux 已允许 Nginx 网络代理
  • 静态网页可以正常访问
  • Vue / React History 路由已配置 try_files
  • 正式上线时只暴露必要端口

第二十五部分:牢记这张部署关系图

text 复制代码
                    用户浏览器
                        │
                 HTTP / HTTPS
                  80 / 443
                        │
                        ▼
                 ┌───────────┐
                 │   Nginx   │
                 └─────┬─────┘
                       │
          ┌────────────┴────────────┐
          │                         │
          ▼                         ▼
   Vue / React / HTML           /api 请求
   静态文件                        │
                                   ▼
                           ┌───────────────┐
                           │ Node.js :3000 │
                           └───────┬───────┘
                                   │
                                   ▼
                                  PM2

对公网:

text 复制代码
开放:22 / 80 / 443

服务器内部:

text 复制代码
Node:127.0.0.1:3000

这是非常常见、也非常适合普通 Node.js Web 服务的部署结构。


第二十五部分:安装 Redis

72. 安装 Redis

Rocky Linux 9 可以直接通过系统模块安装 Redis。

先查看可用版本:

bash 复制代码
dnf module list redis

安装 Redis 7:

bash 复制代码
dnf module install redis:7 -y

启动并设置开机启动:

bash 复制代码
systemctl enable --now redis

检查状态:

bash 复制代码
systemctl status redis

查看版本:

bash 复制代码
redis-server --version

测试:

bash 复制代码
redis-cli ping

正常返回:

text 复制代码
PONG

73. 设置 Redis 密码

Redis 配置文件:

text 复制代码
/etc/redis/redis.conf

如果没有安装 Vim:

bash 复制代码
yum install -y vim

编辑配置:

bash 复制代码
vim /etc/redis/redis.conf

在 Vim 中按 Esc,然后搜索:

text 复制代码
/requirepass

n 可以继续查找下一个匹配项。真正需要修改的是类似:

conf 复制代码
# requirepass foobared

改成:

conf 复制代码
requirepass 你的Redis密码

保存退出:

text 复制代码
Esc
:wq

重启 Redis:

bash 复制代码
systemctl restart redis

不带密码测试:

bash 复制代码
redis-cli ping

此时应该返回:

text 复制代码
NOAUTH Authentication required.

进入 Redis:

bash 复制代码
redis-cli

认证:

text 复制代码
AUTH 你的Redis密码

正常返回:

text 复制代码
OK

再执行:

text 复制代码
PING

返回:

text 复制代码
PONG

说明密码已经生效。

本地 VMware 开发环境可以使用便于记忆的密码;正式公网服务器建议使用长度更长、组合更复杂的密码。


74. Redis 不建议开放公网端口

如果 Node.js 与 Redis 在同一台服务器:

text 复制代码
Node.js
   ↓
127.0.0.1:6379
   ↓
Redis

通常不需要开放 6379

检查绑定配置:

bash 复制代码
grep "^bind" /etc/redis/redis.conf

建议保持仅本机访问,例如:

conf 复制代码
bind 127.0.0.1 -::1

Node.js 连接示例:

js 复制代码
{
  host: '127.0.0.1',
  port: 6379,
  password: '你的Redis密码'
}

第二十六部分:安装 MySQL

75. 查看 MySQL 可用版本

bash 复制代码
dnf module list mysql

Rocky Linux 9 建议优先使用 MySQL 8.4 LTS。

安装:

bash 复制代码
dnf module install mysql:8.4/server -y

76. 启动 MySQL

bash 复制代码
systemctl enable --now mysqld

检查:

bash 复制代码
systemctl status mysqld

查看版本:

bash 复制代码
mysql --version

77. MySQL 初始化

可以使用:

bash 复制代码
mysql_secure_installation

它会引导设置:

text 复制代码
root 密码
匿名用户
root 远程登录
测试数据库
权限表刷新

如果交互过程中终端状态异常,甚至 Ctrl + C / Ctrl + Z 都无响应,可以直接关闭当前终端并重新 SSH 登录。MySQL 服务本身通常不会因此损坏。

不想继续使用交互脚本,也可以直接手动完成下面的初始化操作。


78. 本地开发环境降低 MySQL 密码强度

如果只是本地 VMware 开发环境,不想设置很复杂的密码,可以先登录:

bash 复制代码
mysql -uroot

如果 root 已经有密码:

bash 复制代码
mysql -uroot -p

查看密码策略:

sql 复制代码
SHOW VARIABLES LIKE 'validate_password%';

将策略降低为 LOW,并把最小长度设置为 4:

sql 复制代码
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 4;

然后设置 root 密码:

sql 复制代码
ALTER USER 'root'@'localhost'
IDENTIFIED BY '你的密码';

刷新权限:

sql 复制代码
FLUSH PRIVILEGES;

退出:

sql 复制代码
exit;

重新登录验证:

bash 复制代码
mysql -uroot -p

SET GLOBAL 修改的密码策略在 MySQL 重启后可能恢复默认。正式阿里云 / 公网服务器建议重新使用强密码策略。


79. 手动完成 MySQL 基础安全初始化

登录:

bash 复制代码
mysql -uroot -p

删除匿名用户:

sql 复制代码
DROP USER IF EXISTS ''@'localhost';

删除测试数据库:

sql 复制代码
DROP DATABASE IF EXISTS test;

刷新权限:

sql 复制代码
FLUSH PRIVILEGES;

80. 创建 Node.js 项目数据库

例如项目名叫 blog

sql 复制代码
CREATE DATABASE blog
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

查看:

sql 复制代码
SHOW DATABASES;

81. 不要让 Node.js 使用 root 账号

创建业务账号:

sql 复制代码
CREATE USER 'blog'@'127.0.0.1'
IDENTIFIED BY '你的数据库密码';

授权:

sql 复制代码
GRANT ALL PRIVILEGES
ON blog.*
TO 'blog'@'127.0.0.1';

刷新:

sql 复制代码
FLUSH PRIVILEGES;

Node.js 配置示例:

js 复制代码
{
  host: '127.0.0.1',
  port: 3306,
  user: 'blog',
  password: '你的数据库密码',
  database: 'blog'
}

82. MySQL 不建议直接开放公网

如果 Node.js 与 MySQL 在同一台服务器:

text 复制代码
Node.js
   ↓
127.0.0.1:3306
   ↓
MySQL

通常不需要开放 3306

正式公网服务器建议只让业务程序或可信内网访问数据库。


第二十七部分:加入 Redis / MySQL 后的完整服务器结构

text 复制代码
Rocky Linux 9.x
│
├── SSH :22
│
├── Nginx :80 / :443
│      ├── Vue / React / HTML 静态网页
│      └── /api → Node.js
│
├── Node.js :3000
│      └── PM2
│
├── MySQL :3306
│      └── 建议仅本机访问
│
└── Redis :6379
       └── 建议仅本机访问

对公网通常只需要开放:

text 复制代码
22
80
443

一般不需要开放:

text 复制代码
3000
3306
6379

第二十八部分:Redis / MySQL 检查清单

  • Redis 7 已安装
  • Redis 已设置开机启动
  • redis-cli ping 可以正常返回
  • Redis 已设置密码
  • Redis 6379 未直接暴露公网
  • MySQL 8.4 已安装
  • MySQL 已设置开机启动
  • root 可以使用密码正常登录
  • 本地开发环境的密码策略已按需要调整
  • 已删除匿名用户和 test 数据库
  • 已创建 Node.js 专用数据库
  • 已创建 Node.js 专用数据库账号
  • MySQL 3306 未直接暴露公网

参考资料


文档版本

text 复制代码
教程版本:1.0
更新时间:2026-08-26
推荐基线:
- Rocky Linux 9.x(当前 9.8)
- Node.js 24 LTS
- NVM 0.40.3
- Nginx
- PM2
- VMware Workstation

以后即使 Rocky Linux 9 的小版本或 Node.js 24 的小版本发生变化,整体安装和部署流程仍然基本一致。

相关推荐
马可家的菠萝2 小时前
自动保存已经有了,为什么笔记软件还需要“历史版本”?
前端·后端·架构
星栈2 小时前
决定 Agent 交付下限的「操作系统」:Harness 六层架构拆解
人工智能·架构·agent
谢文峰4 小时前
从 Skill 私有记忆到共享 Agent Knowledge
架构
代码方舟5 小时前
零信任架构实战:基于天远普通维保查询构建自动化汽车后市场供应链网关
人工智能·架构·自动化·汽车
天远Date Lab5 小时前
零信任架构实战:基于天远普通维保查询构建自动化车辆收车评估网关
运维·人工智能·架构·自动化
IT小白杨6 小时前
哪种浏览器适合跨境电商?2026场景化方案建议与架构对比
服务器·chrome·经验分享·架构·安全架构·指纹浏览器
Cicada1286 小时前
微服务是怎么长出来的
微服务·云原生·架构
阿甘编程点滴7 小时前
AI配音软件技术评测|底层架构与功能能力对比
人工智能·架构