Nginx在kubernetes ingress上暴露时无法找到静态react应用程序文件



我正试图通过nginx服务器将我的react应用程序部署到kubernetes集群。正如你在下面的Dockerfile中看到的,我正在构建我的应用程序,然后将构建的工件复制到我的nginx服务器上的/usr/share/nginx/html/路径中。

# Stage 1 - build container
FROM node:12-alpine as build
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY yarn.lock ./
COPY package.json ./
RUN yarn install
COPY . ./
ENV GENERATE_SOURCEMAP=false SASS_PATH=node_modules:src
ARG env
RUN yarn run build:${env}
# Stage 2 - productive environment
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/conf.d/default.conf
RUN apk update  
RUN apk upgrade 
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

我使用以下nginx配置。据我所知,这应该指示nginx服务器使用指定的根路径搜索资源。

server {
listen 80;
root   /usr/share/nginx/html;
error_page   500 502 503 504  /50x.html;
location / {
index  index.html index.htm;
try_files $uri $uri/ /index.html;
}
}

我可以看到,当在本地运行docker容器时,这是有效的(所有react应用程序资源都被加载(,但当我将其部署到我的kubernetes集群上并通过入口控制器公开它时,我会收到以下构建工件的错误:

GET https://*host*/static/css/main.0e41ac5f.chunk.css net::ERR_ABORTED 404

这很有趣,因为当我ssh到容器中时,我可以看到所有请求的文件仍然存在于正确的目录(/usr/share/nginx/html/static/(中。

我已经尝试将包.json中的主页值设置为".",但这并没有改变任何内容。

我的入口配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: search-dev
annotations:
kubernetes.io/ingress.class: "public-iks-k8s-nginx"
spec:
tls:
hosts:
- host
secretName: secret
rules:
- host: host
http:
paths:
- path: /
pathType: Exact
backend:
service:
name: search-frontend-dev
port:
number: 80

我还尝试设置这个注释:

nginx.ingress.kubernetes.io/rewrite-target: /

但不幸的是,这也没有奏效。

非常感谢您的帮助。

对于有类似问题的所有人,请将pathType设置为前缀。否则仅请求"/"将路由到您的服务。请求"/静态/"只是没有路由到服务,因此也没有路由到我的nginx服务器。

最新更新