reactjs - 为 react 应用设置 nginx 代理
问题描述
我正在尝试使用两个服务创建一个 docker-compose,一个 Spring Boot 后端(在端口 8080 上运行)和在 Nginx 上运行的 React 前端。
React 应用调用后端 API,例如 /api/tests。但是,当我运行 docker compose 并且前端发出请求时,它总是失败并出现 404 错误:GET http://localhost/api/tests 404 (Not Found)
当我将前端 dockerfile 设置为不使用 Nginx 时npm start
,它工作正常,但我更喜欢在 Nginx 上使用生产版本。
当前前端 dockerfile:
FROM node:11.13 as builder
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install
RUN npm install react-scripts@2.1.8 -g
COPY ./package-lock.json /usr/src/app/
COPY ./public /usr/src/app/public
COPY ./src /usr/src/app/src
COPY ./nginx.conf /etc/nginx/nginx.conf
RUN npm run build
FROM nginx:1.15.10-alpine
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
Nginx.conf:
server {
listen 80;
location / {
try_files $uri $uri/ /index.html;
add_header Cache-Control public;
expires 1d;
}
location /api {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://server:8080/;
}
}
码头工人撰写:
version: "3"
services:
server:
build: test-server/
expose:
- 8080
ports:
- 8080:8080
ui:
build: test-ui/
expose:
- 80
ports:
- 80:80
react 应用程序的 package.json 中有一行"proxy": "http://server:8080"
。
Nginx 记录以下错误:
2019/04/15 12:50:03 [error] 6#6: *1 open() "/usr/share/nginx/html/api/tests" failed (2: No such file or directory), client: 172.20.0.1, server: localhost, request: "GET /api/tests HTTP/1.1", host: "localhost", referrer: "http://localhost/"
解决方案
我发现了问题。在 docker 镜像的多阶段构建中,我不小心将 nginx.conf 文件复制到了构建器镜像中,而不是生产镜像中。
固定的 Dockerfile 现在看起来像这样:
# build environment
FROM node:11.13 as builder
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json
RUN npm install
RUN npm install react-scripts@2.1.8 -g
COPY ./package-lock.json /usr/src/app/
COPY ./public /usr/src/app/public
COPY ./src /usr/src/app/src
RUN npm run build
# production environment
FROM nginx:1.15.10-alpine
COPY --from=builder /usr/src/app/build /var/www
COPY ./nginx.conf /etc/nginx/nginx.conf
CMD ["nginx", "-g", "daemon off;"]
和 nginx.conf:
server {
listen 80;
include /etc/nginx/mime.types;
root /var/www;
index index.html index.htm;
location /api {
resolver 127.0.0.11;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://server:8080$request_uri;
}
location / {
try_files $uri $uri/ =404;
}
}
推荐阅读
- c# - 来自 TextBox.Text 的 System.NullException
- java - BouncyCastle ECDSA signing takes several milliseconds
- c# - 带有 dd/MM/yyyy 格式的字符串到日期时间,与系统日期时间格式无关
- vba - 从Word VBA中的txt文件动态导入文本
- jmeter - 如何使用 JMeter 的 while 循环来验证采样器中需要再次执行的值?
- node.js - 使用 ApolloClient 和 Apollo-Server-Express 处理 GraphQL 错误
- linux - Linux 目录访问权限
- php - 使用 python 脚本将图像上传到 php 数据库
- bash - 如何使用重定向的标准输入、标准输出和标准错误保持 LLDB 运行
- javascript - 我怎样才能允许用户只输入字母和特殊字符而不是整数或数字