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

Docker+Nginx反向代理+React(Webpack)环境下404问题排查与优化

Docker部署Node+React(Webpack构建)应用的路由问题与方案疑问

我在Docker部署Node+React(Webpack构建)应用时,遇到了BrowserRouter直接导航404的问题:访问localhost:3050/SomePage时Nginx返回404,原因是Nginx无法识别React的前端路由。

通用解决方案是把React构建产物放到/usr/share/nginx/html,并通过try_files指令回退到index.html。我已经配置了将Webpack生成的dist目录复制到该路径,但构建流程仍有问题。

另外我还想了解:兼顾生产就绪与本地开发友好的最佳实践是什么?是否不应该使用Webpack-CLI?

补充:怀疑问题源于Docker层缓存,已经尝试无缓存重建,但问题依旧。


相关配置文件

Nginx default.conf

upstream client {
  server client:3000;
}

upstream api {
  server api:3001;
}

server {
  listen 80;

  location / {
      proxy_pass http://client;
      # root   /usr/share/nginx/html;
      # index  index.html index.htm;
      try_files $uri $uri/ /index.html;
  }

  location /sockjs-node {
      proxy_pass http://client;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
  }
  
  location /api {
      rewrite /api/(.*) /$1 break;
      proxy_pass http://api;
  }
}

Nginx Dockerfile

FROM nginx
COPY ./default.conf /etc/nginx/conf.d/default.conf

Client package.json(关键部分)

"scripts": {
    "start": "webpack serve --config webpack.config.js --mode development",
    "build": "webpack --config webpack.config.js --mode development"
....

  "devDependencies": {
    "webpack-cli": "^5.1.4"
  }

Client Dockerfile(尝试1:开发模式)

FROM node:alpine

# Set NODE_ENV to 'production' by default
ENV NODE_ENV=development

WORKDIR /app
COPY package.json ./
COPY package-lock.json ./

COPY ./ ./
RUN npm i
CMD ["npm", "run", "start"]

Client Dockerfile(尝试2:多阶段构建)

# Stage 0: Build React app
FROM node:alpine as build-stage

# Set NODE_ENV to 'production' by default
ENV NODE_ENV=development

WORKDIR /app
COPY package*.json ./

# Install app dependencies
RUN npm install webpack-cli && \
    npm install

COPY ./ ./
RUN npm run build

# Stage 1: Final image
FROM nginx
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY --from=build-stage ../nginx/default.conf /etc/nginx/conf.d/default.conf

Server Dockerfile

FROM node:alpine
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
COPY ./ ./
RUN npm i
CMD ["npm", "run", "dev"]

docker-compose.yml

version: '3.8'

services:
  nginx:
    depends_on:
      - api
      - client
    restart: always
    build:
      dockerfile: Dockerfile
      context: ./nginx
    ports:
      - "3050:80"

  api:
    build:
      dockerfile: Dockerfile
      context: "./server"
    volumes:
      - /app/node_modules
      - ./server:/app
    env_file:
      - ./server/keys/dev.env

  client:
    stdin_open: true
    environment:
      - CHOKIDAR_USEPOLLING=true
      - NODE_ENV=development
    build:
      dockerfile: Dockerfile
      context: ./client
    volumes:
      - /app/node_modules
      - ./client:/app

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:32:04