在nginx-ingress后面的aks上托管django

我正在尝试在Azure kubernetes服务behide nginx-ingress上托管一个django网站,我想在一个路径下进行django网络展示。

例如访问默认管理网站时,我想访问http://example.com/django/admin而不是http://example.com/admin

我尝试了以下配置,当我访问http://example.com/django/admin时,它将转发我到http://example.com/admin并向我显示默认入口后端的404错误,因为我将django debug设置为ture,我认为这意味着入口确实做了不能将我的请求发送到我的Django服务

# path example
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: django-ingress
  labels:
    app: django
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: django-service
          servicePort: 80
        path: /django(/|$)(.*)

所以我尝试curl -I -k http://example.com/django/admin,它显示如下内容

HTTP/1.1 301 Moved Permanently
Server: openresty/1.15.8.2
Date: Wed,06 Nov 2019 04:14:14 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Location: /admin/

如果我curl -I -k http://example.com/django/any_valid_page显示在网站上,则该网站上的所有有效页面也会发生相同的情况:

HTTP/1.1 301 Moved Permanently
Server: openresty/1.15.8.2
Date: Wed,06 Nov 2019 04:14:14 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Location: /any_valid_page/

我想知道这是由我使用默认的django开发Web服务器进行测试引起的吗? (即python manage.py runserver

如果我尝试将其托管在如下所示的根目录下,一切都很好...

# root example
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: django-ingress
  labels:
    app: django
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: django-service
          servicePort: 80
        path: /
zhk222zhk 回答:在nginx-ingress后面的aks上托管django

尝试添加

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: django-ingress
  labels:
    app: django
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    ingress.kubernetes.io/rewrite-target: /django
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: django-service
          servicePort: 80
        path: /django
,
  

从0.22.0版开始,使用注释进入定义   nginx.ingress.kubernetes.io/rewrite-target不向后   与以前的版本兼容。在0.22.0及更高版本中,任何   请求URI中需要传递给   必须在捕获组中显式定义重写的路径。所以做   确保您使用的版本正确。

在群集外部使用SSL卸载时,即使没有可用的TLS证书,强制执行到HTTPS的重定向也是有用的。这可以通过在特定资源中使用nginx.ingress.kubernetes.io/force-ssl-redirect: "true"注释来实现。

我认为您的Ingress配置文件应如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: django-ingress
  labels:
    app: django
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /django(/|$)(.*)
            backend:
              serviceName: django-service
              servicePort: 80

如果出现404错误,则可能有解决方案:

请在curl命令中将https更改为http

curl --resolve your-host:80:xx.xxx.xx.xxx http://my-host:80

要从kubectl get ing命令获取IP,必须 启用报告入口状态功能。看看:reporting-ingress-status

Ingress控制器中有默认服务器。它返回 未找到页面,其中包含 404 状态代码 没有为其定义Ingress规则的域。这些要求 不会显示在访问日志中。

由于得到的是 404 ,因此这意味着您的主机标头 请求与Ingress资源中的主机字段不匹配。 要将主机头设置为curl,请参见先前的curl 命令。您也可以选择执行以下操作:

curl http://<ip> -H "host: example.com"

请查看ngnix-ingressserver-side-https-enforcement-nginx

本文链接:https://www.f2er.com/3154963.html

大家都在问