You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose+Nginx代理React与Node.js服务路由故障排查

问题分析与解决方案

你的问题出在React单页应用的子路径适配和Nginx代理路径传递两个核心点上:React默认基于根路径/构建,直接通过/signup/或/background/访问时,静态资源路径和前端路由都会出现匹配错误,同时代理Nginx的路径转发规则也没有正确处理前缀。

以下是分步解决方法:

1. 调整React应用的构建配置

修改React项目的构建参数,让静态资源路径自动带上子路由前缀:

  • Create React App项目:在项目根目录的package.json中添加homepage字段
    // frontend项目
    {
      "homepage": "/signup"
    }
    
    // background项目
    {
      "homepage": "/background"
    }
    
  • Vite项目:修改vite.config.js中的base配置
    // frontend项目
    export default defineConfig({
      base: '/signup/'
    })
    
    // background项目
    export default defineConfig({
      base: '/background/'
    })
    

2. 适配React前端路由

如果使用React Router,需要为路由添加basename属性,确保前端路由匹配子路径:

// frontend应用路由
import { BrowserRouter } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter basename="/signup">
      {/* 你的路由组件 */}
    </BrowserRouter>
  );
}

// background应用路由
function App() {
  return (
    <BrowserRouter basename="/background">
      {/* 你的路由组件 */}
    </BrowserRouter>
  );
}

3. 修改代理Nginx的配置(docker-compose使用的nginx.conf)

修正路径转发规则,确保请求前缀被正确剥离后传递给React容器,同时添加必要的请求头:

upstream frontend {
    server frontend:3000;
}

upstream backend {
    server backend:8000;
}

upstream background {
    server background:3000;
}

server {
    listen 80;

    # 处理frontend子路由
    location /signup {
        rewrite ^/signup(.*)$ $1 break;
        proxy_pass http://frontend;
        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;
    }

    # 处理background子路由
    location /background {
        rewrite ^/background(.*)$ $1 break;
        proxy_pass http://background;
        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;
    }

    # 后端API配置保持不变
    location /api {
        rewrite /api/(.*) /$1 break;
        proxy_pass http://backend;
        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;
    }
}

4. 重新构建并启动服务

  • 重新构建两个React应用的Docker镜像:
    # 构建frontend镜像
    docker build -t signup:frontend ./你的frontend项目目录
    
    # 构建background镜像
    docker build -t background ./你的background项目目录
    
  • 重启Docker Compose服务:
    docker-compose down
    docker-compose up -d
    

完成以上步骤后,即可通过localhost/signup/访问frontend、localhost/background/访问background,localhost/api/访问后端服务。

内容的提问来源于stack exchange,提问作者huihui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:53:15