uWSGI 和 NGINX 502:上游过早关闭连接

uWSGI 和 NGINX 502:上游过早关闭连接

我有一个 Kubernetes 集群,它在由 uWSGI 提供服务的 docker 容器中运行 Django 应用程序。入口控制器是 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 ["/usr/local/bin/uwsgi", "--ini", "/app/in_web_server/docker/in/in_web_server_uwsgi.ini"]

Kubernetes 入口:

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 请求。我说的较大是指 ~300KB,所以这不是什么大问题。

此外,大约 1 分钟后返回 502 错误,因此可能存在超时问题。但是我无法找到它,因为 uwsgi 日志中没有任何痕迹。有什么提示我做错了什么吗?

答案1

https://monicalent.com/blog/2013/12/06/set-up-nginx-and-uwsgi/ 我发现“limit-as”选项限制了进程虚拟内存大小,并且可能导致 502 错误代码和消息“上游过早关闭连接”。

答案2

根据问题(见下面的列表),我建议尝试关闭缓冲,并尝试使用超时值。例如,尝试将它们放入 nginx-ingress 控制器配置图并将其从 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"

问题列表:

手册:

相关内容