web-dev-qa-db-ja.com

uWSGIおよびNGINX 502:アップストリームの途中で閉じられた接続

Django uWSGIが提供するdockerコンテナー内のアプリケーションを実行しているKubernetesクラスターがあります。入力コントローラーは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要求の場合にのみ発生します。大まかに言うと、300KB以下なので、大した問題ではありません。

また、502エラーは約1分後に返さ​​れるため、タイムアウトの問題が発生している可能性があります。しかし、uwsgiログ内にトレースがないため、それを見つけることができません。私が間違っていることのヒントはありますか?

3
Djent

から https://monicalent.com/blog/2013/12/06/set-up-nginx-and-uwsgi/ プロセスの仮想メモリサイズを制限する「limit-as」オプションが見つかりましたそして、「上流の時期尚早に閉じられた接続」というメッセージを伴う502エラーコードの原因である可能性があります。

1
Yves Martin

問題に基づいて(以下のリストを参照)、バッファリングをオフにして、タイムアウト値を試すことをお勧めします。たとえば、それらを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"

問題リスト:

マニュアル:

0
VAS