![为什么 nginx 在正常关闭期间不等到我的连接?](https://linux22.com/image/677173/%E4%B8%BA%E4%BB%80%E4%B9%88%20nginx%20%E5%9C%A8%E6%AD%A3%E5%B8%B8%E5%85%B3%E9%97%AD%E6%9C%9F%E9%97%B4%E4%B8%8D%E7%AD%89%E5%88%B0%E6%88%91%E7%9A%84%E8%BF%9E%E6%8E%A5%EF%BC%9F.png)
我有一个 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