Назад | Перейти на главную страницу

uWSGI и NGINX 502: преждевременно закрытое соединение в восходящем направлении

У меня есть кластер Kubernetes, в котором запущено приложение Django в контейнере докеров, обслуживаемом uWSGI. Контроллер входящего трафика - ingress-nginx (этот: https://github.com/kubernetes/ingress-nginx).

Недавно я обновил весь кластер с 1.9 до 1.11, и из-за некоторых проблем мне пришлось запустить kubeadm reset и kubeadm init очередной раз.

С тех пор (я думаю) иногда я получаю странные ошибки 502, о которых сообщают пользователи: upstream prematurely closed connection while reading response header from upstream.

Самая большая проблема для меня в том, что эти запросы не видны в журналах uWSGI внутри контейнера, поэтому я понятия не имею, что происходит.

Вот мой файл uwsgi.ini:

[uwsgi]

http = 0.0.0.0:8000
# Django-related settings
# the base directory (full path)
chdir = /app
# Django's wsgi file
module = in_web_server.wsgi:application
pythonpath = /app

static-map = /static=/app/static

# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# clear environment on exit
vacuum = true

# spooler setup
spooler = /spooler
spooler-processes = 2
spooler-frequency = 10

Dockerfile CMD: CMD ["/usr/local/bin/uwsgi", "--ini", "/app/in_web_server/docker/in/in_web_server_uwsgi.ini"]

Kubernetes Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: in-debug
  namespace: in-debug
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "0"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($request_uri ~ "^[^?]*?//") {
          rewrite "^" $scheme://$host$uri permanent;
      }
spec:
  rules:
  - host: test-in
    http:
      paths:
      - path: "/"
        backend:
          serviceName: in-debug
          servicePort: 8000

Эти ошибки относятся только к большим (но не очень большим) запросам PUT. Под большим я имею в виду ~ 300 КБ, так что это не имеет большого значения.

Кроме того, ошибка 502 возвращается примерно через 1 минуту, поэтому, возможно, возникла проблема с тайм-аутом. Однако я не могу его найти, поскольку в журнале uwsgi нет следов. Есть намеки на то, что я делаю не так?

Из https://monicalent.com/blog/2013/12/06/set-up-nginx-and-uwsgi/ Я обнаружил параметр «limit-as», который ограничивает размер виртуальной памяти процесса и может быть ответственным за код ошибки 502 с сообщением «восходящее преждевременно закрытое соединение».

Основываясь на проблемах (см. Список ниже), я бы рекомендовал попробовать отключить буферизацию и поэкспериментировать со значениями тайм-аута. Например, попробуйте поставить их на контроллер nginx-ingress. config-map и удалите их из конфигурации объекта Ingress.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: in-debug
  namespace: in-debug
  annotations:
    nginx.org/proxy-buffering: "False"
...

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-config
data:
  proxy-connect-timeout: "600s"
  proxy-read-timeout: "600s"
  client-max-body-size: "5m"

Список проблем:

Руководства: