为什么 nginx 在正常关闭期间不等到我的连接?

为什么 nginx 在正常关闭期间不等到我的连接?

我有一个 nginx web 服务器,我对其执行nginx -s quit。这应该是正常关闭,因此它应该等待所有连接完成后再关闭。

为了测试它是否按宣传的那样运行,我对 nginx 提供的 10M 文件执行了 curl,速度为--rate-limit=1024K(每秒),给我 10 秒钟的时间执行,nginx -s quit然后下载才会完成。我期望 nginx 完成下载然后关闭,但每次我在下载开始时执行此操作时,nginx 都会退出,并且 curl 会显示:

curl: (18) transfer closed with 2019456 bytes remaining to read

nginx 为什么要关闭?我找不到任何文档说“Nginx 等待所有连接完成除了……”我唯一的理论是,由于速率限制,curl 在发送数据包之间等待的时间太长,以至于 nginx 认为连接已过时……或者其他问题。

我做错了什么或者误解了什么?

编辑:

我在本地机器上也做过同样的测试,一切正常,所以这已经不是nginx的问题了。信号不正常的环境是google的Kubernetes容器集群管理器,其中运行着 nginx。nginx -s quit作为停止前钩子执行,但当我在下载期间执行进入 docker 容器并在命令行上运行 quit 命令时,它也会失败。注意:我成功的本地机器测试是在 docker 容器内运行 nginx 的情况下完成的,因此它不是 docker。

答案1

我能想到的唯一明显的事情是,nginx 在容器内部是 PID 1,但在您的桌面上不是。这里没有什么特别之处,kubernetes 在这方面只是普通的 Docker。

我尝试重现此情况,但对我来说它工作正常。这是我使用的 pod:

apiVersion: v1
kind: Pod 
metadata:
  namespace: demos
  name: pods-demo
  labels:
    demo: pods
spec:
  containers:
  - name: busybox
    image: busybox
    command:
    - sh
    - -c
    - dd if=/dev/zero of=/data/index.html bs=1024 count=10240; sleep 1000000
    volumeMounts:
    - name: content
      mountPath: /data
  - name: nginx
    image: nginx
    volumeMounts:
      - name: content
        mountPath: /usr/share/nginx/html
        readOnly: true
  volumes:
  - name: content

相关内容