当 URI 具有参数 ( "?" ) 或上传后,入口 nginx 路径会以"Bad Gateway"的形式返回



我正在将一个PHP应用程序移动到Kubernetes中,并在执行一些操作后运行到"坏网关"中。

我认为错误来自两件事之一:

  • PHP程序正在向http://192.168.39.129/admin/a_merge_xls_db.php?tmp_tbl=_imp_companies_20200329_160813发送GET
  • 或者从上传本身

我怀疑这是最后一个,因为这个Excel文件只有14kb。

现在的情况是,用户有一个Excel模板来导入新帐户。他们进入管理门户/admin,选择导入,它解析Excel文件,并导入到Postgres中。

尽管出现了这个错误,但数据正在进入数据库。成功导入后,会向a_merge_xls_db.php?tmp_tbl=_imp_companies_20200329_160813发送一个GET。这就是"坏网关"在大约7秒后出现的时候。

似乎这可能是我的ingress.yamlingress-nginx和处理?=_之类的问题。我尝试了一些方法,但仍然无法解决问题。

以下是我在ingress.yaml:中的内容

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/add-base-url: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/proxy-body-size: 500mb
name: ingress-service
namespace: default
spec:
rules:
- http:
paths:
- path: /?(.*)
backend:
serviceName: client-cluster-ip-service-dev
servicePort: 3000
- path: /admin/?(.*)
backend:
serviceName: admin-cluster-ip-service-dev
servicePort: 4000
- path: /api/?(.*)
backend:
serviceName: api-cluster-ip-service-dev
servicePort: 5000

有什么建议吗?

附加信息3/30/20

我包括了Dockerfile.devadmin.yaml,因为我仍然有问题:

# Dockerfile.dev
FROM php:7.3-fpm
EXPOSE 4000
RUN apt-get update  
&& apt-get install -y libpq-dev zlib1g-dev libzip-dev 
&& docker-php-ext-install pgsql zip
COPY . /app
WORKDIR /app/src
CMD ["php", "-S", "0.0.0.0:4000"]
# admin.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: admin-deployment-dev
spec:
replicas: 1
selector:
matchLabels:
component: admin
template:
metadata:
labels:
component: admin
spec:
containers:
- name: admin
image: testappacr.azurecr.io/test-app-admin
ports:
- containerPort: 4000
env:
- name: PGUSER
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: PGUSER
- name: PGHOST
value: postgres-cluster-ip-service-dev
- name: PGPORT
value: "1423"
- name: PGDATABASE
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: PGDATABASE
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: PGPASSWORD
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: SECRET_KEY
- name: SENDGRID_API_KEY
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: SENDGRID_API_KEY
- name: DOMAIN
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: DOMAIN           
- name: DEBUG
valueFrom:
secretKeyRef:
name: test-app-dev-secrets
key: DEBUG
volumeMounts:
- mountPath: "/docs/"
name: file-storage
volumes:
- name: file-storage
persistentVolumeClaim:
claimName: file-storage
---
apiVersion: v1
kind: Service
metadata:
name: admin-cluster-ip-service-dev
spec:
type: ClusterIP
selector:
component: admin
ports:
- port: 4000
targetPort: 4000

如果我只有- path: /admin,我会遇到一个问题,即资产没有得到服务。.css.js200一样返回,但应用程序不应用任何内容。如果我导航到资产的URL,例如http://192.168.39.129/admin/css/portal.css,它只显示您转到/admin时得到的页面。

这个问题通过改回- path: /admin/?(.*)得到了解决,但后来我遇到了我最初发布的问题。

我早上大部分时间都在玩各种正则表达式,但当涉及到"坏域"时,仍然会得到相同的结果。

考虑到我正在学习Kubernetes,我可能忽略了一些东西。考虑到代码管理员的建议,以及这个与相同的问题,它似乎真的应该起作用

https://github.com/kubernetes/ingress-nginx/issues/3380

您需要指定nginx.ingress.kubernetes.io/use-regex: "true"注释。之所以调用它,是因为默认情况下Kubernetes Ingress对象需要纯前缀匹配,而不是regexs。或者在您的情况下,只需使用实际前缀//admin/api

最新更新