一台服务器如何同时部署前端React应用和Node.js后端服务?

在云服务器上同时部署 React 前端和 Node.js 后端,核心思路是构建分离、反向X_X统一入口。React 作为静态资源,Node.js 作为动态 API 服务,两者通过 Nginx(或 Caddy 等)进行流量分发。以下是基于生产环境的标准化实施方案:

1. 项目结构规划

建议采用前后端分离的目录结构,便于维护:

/home/project/
├── frontend/      # React 源码及构建产物
├── backend/       # Node.js 源代码
└── nginx.conf     # 反向X_X配置

2. 前端构建与部署

React 应用需要编译为静态文件(HTML/CSS/JS),不能直接运行源码。

  • 本地构建:在项目根目录执行 npm run build(或 yarn build),生成 distbuild 目录。
  • 上传服务器:将构建后的静态文件上传至服务器的 /home/project/frontend/dist 目录。
  • 注意:若 React 使用了 create-react-app 且开启了 Hash 路由,需确保 Nginx 配置支持 fallback,否则刷新页面会 404。

3. 后端启动方案

Node.js 服务通常使用 PM2 进程管理器来保证高可用和自动重启。

  • 安装 PM2npm install -g pm2
  • 启动服务:进入后端目录,执行 pm2 start server.js --name my-api(假设主入口为 server.js)。
  • 守护进程:配置 pm2 startup 并保存配置,确保服务器重启后服务自动拉起。
  • 端口绑定:Node.js 服务监听本地端口(如 3000),不要直接绑定公网 IP,由 Nginx 转发即可。

4. Nginx 反向X_X配置

这是最关键的一步,Nginx 负责将用户的 HTTP 请求根据路径分发到前端静态文件或后端 API。

编辑 /etc/nginx/sites-available/default(具体路径视发行版而定):

server {
    listen 80;
    server_name your-domain.com; # 替换为你的域名或服务器 IP

    # 1. 前端静态资源处理
    location / {
        root /home/project/frontend/dist;
        index index.html;

        # 关键:SPA 路由回退处理,防止刷新 404
        try_files $uri $uri/ /index.html;
    }

    # 2. 后端 API 接口转发
    # 假设所有以 /api 开头的请求都转发给 Node.js
    location /api {
        proxy_pass http://127.0.0.1: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;

        # 可选:设置超时时间,防止长连接断开
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # 3. (可选) 其他静态资源或错误页配置
}

生效配置
执行 sudo nginx -t 检查语法,若无误则 sudo systemctl reload nginx

5. 安全与优化建议

  • HTTPS 加密:生产环境务必开启 HTTPS。可使用 Certbot (acme.sh) 免费申请 Let’s Encrypt 证书,并在 Nginx 中配置 SSL 协议。
  • 防火墙策略:云服务器安全组仅开放 80 (HTTP) 和 443 (HTTPS) 端口,禁止直接暴露 Node.js 的 3000 端口,避免外部直接访问后端逻辑。
  • 环境变量:Node.js 代码中的数据库连接、密钥等敏感信息应通过 .env 文件或系统环境变量注入,严禁硬编码在代码中提交至 Git。
  • 日志管理:配置 Nginx 和 PM2 的日志轮转(logrotate),防止日志文件占用过多磁盘空间。

总结

该方案实现了“动静分离”:用户访问域名时,Nginx 智能判断路径,静态页面直接由 Nginx 高速返回,API 请求透明转发至 Node.js 进程。这种架构不仅性能优异,且易于扩展(例如后续将后端微服务化或引入 Redis 缓存)。

未经允许不得转载:CLOUD云枢 » 一台服务器如何同时部署前端React应用和Node.js后端服务?