Хостинг django на аксе за nginx-ингрессом - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь разместить веб-сайт django в службе Azure kubernetes, кроме nginx-ingress, и я хотел бы, чтобы мое веб-шоу django проходило по пути.

например, при доступе к сайту администратора по умолчанию, я хотел быПолучите доступ к нему на http://example.com/django/admin вместо http://example.com/admin

. Я попытался настроить ниже, когда я получаю доступ к http://example.com/django/admin, он перенаправит меня на http://example.com/admin и покажет мне ошибку 404 из входного бэкенда по умолчанию, как я установилотладка django для 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 по умолчанию? (т.е. 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: /

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Начиная с версии 0.22.0, входные определения с использованием аннотации nginx.ingress.kubernetes.io/rewrite-target не имеют обратной совместимости с предыдущими версиями. В версии 0.22.0 и выше любые подстроки в URI запроса, которые необходимо передать переписанному пути, должны быть явно определены в группе захвата. Поэтому убедитесь, что у вас правильная версия.

При использовании разгрузки SSL за пределами кластера может оказаться полезным принудительное перенаправление на HTTPS, даже если нет сертификата TLS. Это может быть достигнуто с помощью аннотации 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, естьвозможное решение:

Пожалуйста, измените https на http в команде curl?:

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

Чтобы получить IP из команды kubectl get ing, введитенеобходимо включить функцию отчетов о статусе Ingress. Взгляните на: сообщить-статус-входа .

В контроллере Ingress есть сервер по умолчанию. Он возвращает страницу Not Found с кодом состояния 404 для всех запросов доменов, для которых не определены правила входа. Эти запросы не отображаются в журнале доступа.

Поскольку вы получаете 404 , это означает, что заголовок узла ваших запросов не совпадает с полем узла в Ingress. ресурс. Чтобы установить заголовок хоста в curl, смотрите предыдущие команды curl. По желанию вы также можете сделать:

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

Пожалуйста, ознакомьтесь с ngnix-ingress , server-https-Force-nginx .

0 голосов
/ 06 ноября 2019

Попытка добавить это

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
...