Traefik错误使用reactjs加载静态文件
Traefik error loading static files using reactjs
总结
我正在使用 Traefik 作为 docker 容器的反向代理。但是,每当我无法呈现反应页面时,因为静态文件不会通过 traefik
加载,但如果我使用公开端口访问它(不使用 traefik
),它就可以正常工作很好。
此外,代理工作正常,因为有一个 api 可以无错误地访问。
配置
Docker-撰写
# docker-compose.yml
version: '3.7'
services:
traefik:
image: traefik:v2.2.0
ports:
- "${FRONT_HTTP_PORT:-80}:80"
- "${TRAEFIK_PORT:-8080}:8080"
environment:
- TRAEFIK_LOG_LEVEL=DEBUG
- TRAEFIK_PROVIDERS_DOCKER_EXPOSEDBYDEFAULT=false
- TRAEFIK_PROVIDERS_DOCKER=true
- TRAEFIK_PROVIDERS_DOCKER_NETWORK=traefik01
- TRAEFIK_API_INSECURE=true
- TRAEFIK_ENTRYPOINTS_FRONT=true
- TRAEFIK_ENTRYPOINTS_FRONT_ADDRESS=:${FRONT_HTTP_PORT:-80}
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
security_opt:
- label:type:docker_t
frontend:
build: ./frontend
ports:
- "999:80"
expose:
- 80
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.entrypoints=front"
- "traefik.http.routers.frontend.rule=PathPrefix(`/frontend{regex:$$|/.*}`)"
- "traefik.http.routers.frontend.middlewares=frontend-stripprefix"
- "traefik.http.middlewares.frontend-stripprefix.stripprefix.prefixes=/frontend"
- "traefik.http.routers.frontend.priority=2"
# - "traefik.http.routers.frontend.priority=1"
# - "traefik.frontend.rule=Host:ctf.itasahobby.com"
stdin_open: true
api:
build: ./api
expose:
- 80
links:
- database
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.entrypoints=front"
- "traefik.http.routers.api.rule=PathPrefix(`/api{regex:$$|/.*}`)"
- "traefik.http.routers.api.middlewares=api-stripprefix"
- "traefik.http.middlewares.api-stripprefix.stripprefix.prefixes=/api"
- "traefik.http.routers.api.priority=2"
database:
build: ./database
restart: always
networks:
default:
external:
name: testnetwork
React Docker文件
# Frontend (react) Dockerfile
FROM node:13.12.0-alpine
# set working directory
WORKDIR /app
# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH
ENV PORT 80
# install app dependencies
COPY package.json ./
COPY package-lock.json ./
RUN npm install --silent
RUN npm install react-scripts@3.4.1 -g --silent
# add app
COPY . ./
# start app
CMD ["npm", "start"]
图片
这是使用代理的错误图片。
不使用代理工作。
错误是我将以下中间件应用到 React 应用程序:
- "traefik.http.routers.frontend.middlewares=frontend-stripprefix"
- "traefik.http.middlewares.frontend-stripprefix.stripprefix.prefixes=/frontend"
所以即使我正确设置了基础 url 应用程序接收的所有请求都从 url 中删除了“/frontend”并最终返回基础 index.html
这导致错误。
您可以使用 spa-to-http 在容器中为您的 ReactJS 应用程序提供服务,它是 super-simple 并且除了撰写文件之外不需要其他配置:只需在您的 React 前端文件夹中创建一个 Dockerfile
下一个内容:
FROM node:16-alpine as builder
WORKDIR /code/
ADD package-lock.json .
ADD package.json .
RUN npm ci
ADD . .
RUN npm run build
FROM devforth/spa-to-http:latest
COPY --from=builder /code/dist/ .
要在 compose 中路由 traefik:
myapp:
build: "frontend" # name of the folder where Dockerfile is located
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`myapp.localhost`)" -
- "traefik.http.services.myapp.loadbalancer.server.port=8080" # route traffic t0 port 8080
如果您需要更多信息,可以阅读我的 Detailed step-by-step guide to serve Vue.js app using Traefik and spa-to-http
此外,这里有一个 GitHub 存储库:spa-to-http page on GitHub。
披露:我是公司的首席执行官,该公司根据自己的需要创建了 spa-to-http。我们 open-sourced 它并获得了麻省理工学院的许可,因此您可以将它用于任何商业项目
总结
我正在使用 Traefik 作为 docker 容器的反向代理。但是,每当我无法呈现反应页面时,因为静态文件不会通过 traefik
加载,但如果我使用公开端口访问它(不使用 traefik
),它就可以正常工作很好。
此外,代理工作正常,因为有一个 api 可以无错误地访问。
配置
Docker-撰写
# docker-compose.yml
version: '3.7'
services:
traefik:
image: traefik:v2.2.0
ports:
- "${FRONT_HTTP_PORT:-80}:80"
- "${TRAEFIK_PORT:-8080}:8080"
environment:
- TRAEFIK_LOG_LEVEL=DEBUG
- TRAEFIK_PROVIDERS_DOCKER_EXPOSEDBYDEFAULT=false
- TRAEFIK_PROVIDERS_DOCKER=true
- TRAEFIK_PROVIDERS_DOCKER_NETWORK=traefik01
- TRAEFIK_API_INSECURE=true
- TRAEFIK_ENTRYPOINTS_FRONT=true
- TRAEFIK_ENTRYPOINTS_FRONT_ADDRESS=:${FRONT_HTTP_PORT:-80}
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
security_opt:
- label:type:docker_t
frontend:
build: ./frontend
ports:
- "999:80"
expose:
- 80
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.entrypoints=front"
- "traefik.http.routers.frontend.rule=PathPrefix(`/frontend{regex:$$|/.*}`)"
- "traefik.http.routers.frontend.middlewares=frontend-stripprefix"
- "traefik.http.middlewares.frontend-stripprefix.stripprefix.prefixes=/frontend"
- "traefik.http.routers.frontend.priority=2"
# - "traefik.http.routers.frontend.priority=1"
# - "traefik.frontend.rule=Host:ctf.itasahobby.com"
stdin_open: true
api:
build: ./api
expose:
- 80
links:
- database
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.entrypoints=front"
- "traefik.http.routers.api.rule=PathPrefix(`/api{regex:$$|/.*}`)"
- "traefik.http.routers.api.middlewares=api-stripprefix"
- "traefik.http.middlewares.api-stripprefix.stripprefix.prefixes=/api"
- "traefik.http.routers.api.priority=2"
database:
build: ./database
restart: always
networks:
default:
external:
name: testnetwork
React Docker文件
# Frontend (react) Dockerfile
FROM node:13.12.0-alpine
# set working directory
WORKDIR /app
# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH
ENV PORT 80
# install app dependencies
COPY package.json ./
COPY package-lock.json ./
RUN npm install --silent
RUN npm install react-scripts@3.4.1 -g --silent
# add app
COPY . ./
# start app
CMD ["npm", "start"]
图片
这是使用代理的错误图片。
错误是我将以下中间件应用到 React 应用程序:
- "traefik.http.routers.frontend.middlewares=frontend-stripprefix"
- "traefik.http.middlewares.frontend-stripprefix.stripprefix.prefixes=/frontend"
所以即使我正确设置了基础 url 应用程序接收的所有请求都从 url 中删除了“/frontend”并最终返回基础 index.html
这导致错误。
您可以使用 spa-to-http 在容器中为您的 ReactJS 应用程序提供服务,它是 super-simple 并且除了撰写文件之外不需要其他配置:只需在您的 React 前端文件夹中创建一个 Dockerfile
下一个内容:
FROM node:16-alpine as builder
WORKDIR /code/
ADD package-lock.json .
ADD package.json .
RUN npm ci
ADD . .
RUN npm run build
FROM devforth/spa-to-http:latest
COPY --from=builder /code/dist/ .
要在 compose 中路由 traefik:
myapp:
build: "frontend" # name of the folder where Dockerfile is located
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`myapp.localhost`)" -
- "traefik.http.services.myapp.loadbalancer.server.port=8080" # route traffic t0 port 8080
如果您需要更多信息,可以阅读我的 Detailed step-by-step guide to serve Vue.js app using Traefik and spa-to-http
此外,这里有一个 GitHub 存储库:spa-to-http page on GitHub。
披露:我是公司的首席执行官,该公司根据自己的需要创建了 spa-to-http。我们 open-sourced 它并获得了麻省理工学院的许可,因此您可以将它用于任何商业项目