nginx-ingress 将流量发送到 pod 中的 nginx 但不返回资产
nginx-ingress sending traffic to nginx in pod but not returning assets
基本上,我很难从位于子路径 /new-admin
.
的 CRA 网络应用程序获取 nginx
服务 npm build
我在 package.json
中确实有 "homepage": "/new-admin"
和 <Route basename={process.env.PUBLIC_URL}>
在 index.js
中。在开发中工作正常,但现在我正在尝试制作 staging/production 副本,但我很确定这是由于 ./nginx/default.conf
。在我尝试过的各种配置中,none 有效,我要么得到:
500 Internal Server Error
<Uncaught SyntaxError: Unexpected token '<'
这是我的:
# ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/proxy-body-size: "0"
nginx.org/client-max-body-size: "500m"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^(/admin)$ / permanent;
name: ingress-service-dev-admin
namespace: default
spec:
rules:
- http:
paths:
- path: /admin/?(.*)
backend:
serviceName: admin-old-cluster-ip-service-dev
servicePort: 4000
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^(/new-admin)$ / permanent;
name: ingress-service-dev
namespace: default
spec:
rules:
- http:
paths:
- path: /new-admin/
backend:
serviceName: admin-new-cluster-ip-service-dev
servicePort: 4001
- path: /api/
backend:
serviceName: api-cluster-ip-service-dev
servicePort: 5000
- path: /
backend:
serviceName: client-cluster-ip-service-dev
servicePort: 3000
# Dockerfile for /new-admin/
FROM node:13-alpine as builder
WORKDIR /app
COPY ./package.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx
EXPOSE 4001
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/build /usr/share/nginx/html
这个版本的 default.conf
结果是 500 Internal Server Error
:
# ./nginx/default.conf
server {
listen 4001;
root /usr/share/nginx/html;
index index.html index.htm;
location /new-admin {
try_files $uri $uri/ /new-admin/index.html;
}
}
这是关联的 nginx
日志:
[admin-new] 2020/10/05 20:31:49 [error] 28#28: *9 rewrite or internal redirection cycle while internally redirecting to "/new-admin/index.html", client: 172.17.0.4, server: , request: "GET /new-admin/ HTTP/1.1", host: "192.168.64.5"
[admin-new] 172.17.0.4 - - [05/Oct/2020:20:31:49 +0000] "GET /new-admin/ HTTP/1.1" 500 579 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "192.168.64.1"
此版本导致 <Uncaught SyntaxError: Unexpected token '<'
:
# ./nginx/default.conf
server {
listen 4001;
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files $uri $uri/ /index.html;
}
}
这似乎最接近正确,因为它服务于 index.html
,而不是 CSS 和 JS 资产。它确实显示在 index.html
中,应该是正确的:
<script src="/new-admin/static/js/2.c6b4376b.chunk.js"></script>
<script src="/new-admin/static/js/main.c24347bf.chunk.js"></script>
我还注意到它在启动 Pod 时说,尽管它是从头开始构建图像。
[admin-new] /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
[admin-new] /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
[admin-new] /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
[admin-new] 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
[admin-new] 10-listen-on-ipv6-by-default.sh: error: /etc/nginx/conf.d/default.conf differs from the packaged version
[admin-new] /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
[admin-new] /docker-entrypoint.sh: Configuration complete; ready for start up
实际上,遇到这个答案几乎就是我遇到的问题:
React & nginx routing to subdirectory
所以我的最终 ./nginx/default.conf
看起来像这样:
server {
listen 4001;
root /usr/share/nginx/html;
index index.html index.htm;
location = /new-admin {
try_files $uri $uri/ /index.html =404;
}
location ~ ^/new-admin(.*) {
try_files / /index.html =404;
}
}
基本上,我很难从位于子路径 /new-admin
.
nginx
服务 npm build
我在 package.json
中确实有 "homepage": "/new-admin"
和 <Route basename={process.env.PUBLIC_URL}>
在 index.js
中。在开发中工作正常,但现在我正在尝试制作 staging/production 副本,但我很确定这是由于 ./nginx/default.conf
。在我尝试过的各种配置中,none 有效,我要么得到:
500 Internal Server Error
<Uncaught SyntaxError: Unexpected token '<'
这是我的:
# ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/proxy-body-size: "0"
nginx.org/client-max-body-size: "500m"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^(/admin)$ / permanent;
name: ingress-service-dev-admin
namespace: default
spec:
rules:
- http:
paths:
- path: /admin/?(.*)
backend:
serviceName: admin-old-cluster-ip-service-dev
servicePort: 4000
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^(/new-admin)$ / permanent;
name: ingress-service-dev
namespace: default
spec:
rules:
- http:
paths:
- path: /new-admin/
backend:
serviceName: admin-new-cluster-ip-service-dev
servicePort: 4001
- path: /api/
backend:
serviceName: api-cluster-ip-service-dev
servicePort: 5000
- path: /
backend:
serviceName: client-cluster-ip-service-dev
servicePort: 3000
# Dockerfile for /new-admin/
FROM node:13-alpine as builder
WORKDIR /app
COPY ./package.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx
EXPOSE 4001
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/build /usr/share/nginx/html
这个版本的 default.conf
结果是 500 Internal Server Error
:
# ./nginx/default.conf
server {
listen 4001;
root /usr/share/nginx/html;
index index.html index.htm;
location /new-admin {
try_files $uri $uri/ /new-admin/index.html;
}
}
这是关联的 nginx
日志:
[admin-new] 2020/10/05 20:31:49 [error] 28#28: *9 rewrite or internal redirection cycle while internally redirecting to "/new-admin/index.html", client: 172.17.0.4, server: , request: "GET /new-admin/ HTTP/1.1", host: "192.168.64.5"
[admin-new] 172.17.0.4 - - [05/Oct/2020:20:31:49 +0000] "GET /new-admin/ HTTP/1.1" 500 579 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36" "192.168.64.1"
此版本导致 <Uncaught SyntaxError: Unexpected token '<'
:
# ./nginx/default.conf
server {
listen 4001;
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files $uri $uri/ /index.html;
}
}
这似乎最接近正确,因为它服务于 index.html
,而不是 CSS 和 JS 资产。它确实显示在 index.html
中,应该是正确的:
<script src="/new-admin/static/js/2.c6b4376b.chunk.js"></script>
<script src="/new-admin/static/js/main.c24347bf.chunk.js"></script>
我还注意到它在启动 Pod 时说,尽管它是从头开始构建图像。
[admin-new] /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
[admin-new] /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
[admin-new] /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
[admin-new] 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
[admin-new] 10-listen-on-ipv6-by-default.sh: error: /etc/nginx/conf.d/default.conf differs from the packaged version
[admin-new] /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
[admin-new] /docker-entrypoint.sh: Configuration complete; ready for start up
实际上,遇到这个答案几乎就是我遇到的问题:
React & nginx routing to subdirectory
所以我的最终 ./nginx/default.conf
看起来像这样:
server {
listen 4001;
root /usr/share/nginx/html;
index index.html index.htm;
location = /new-admin {
try_files $uri $uri/ /index.html =404;
}
location ~ ^/new-admin(.*) {
try_files / /index.html =404;
}
}