我在 DigitalOcean Kubernetes 集群上运行 NextCloud 15。当我下载大型(>1GB)文件时,出现错误。我似乎已将问题缩小到 nginx,我想知道如何修复它。详情如下:
设置(请求如何路由)
- DigitalOcean 负载均衡器
- nginx 服务(Kubernetes 负载均衡器)
- ingress-nginx pods(3)正在执行 TLS 终止/反向代理
- nextcloud 服务(Kubernetes 服务)
- nextcloud pod
会发生什么:
curl -u [redacted] https://[redacted]/[path to large file]
最终,在成功读取了几百 MB 之后,我得到了以下内容curl
:
curl: (56) GnuTLS recv error (-9): A TLS packet with unexpected length was received.
如果我设置kubectl port-forward
NextCloud 服务或 pod,并指向curl
它,则下载成功。没有导致上游超时的停顿。所以这不是 NextCloud 或其服务的问题。
如果我设置了kubectl port-forward
nginx 服务或 pod,并指向curl
它,我会得到与指向 DigitalOcean LoadBalancer ( A TLS packet with unexpected length was received.
) 相同的结果。因此,很可能是 nginx 导致了这个问题。
配置
nginx 运行的是 TLSv1.2,在 SSLLabs 的运行中没有什么异常。它的版本是 nginx/1.15.6。我已proxy-buffering
通过入口注释关闭并验证它已更新该虚拟主机的nginx.conf
with。nginxproxy_buffering off;
日志中没有错误。每次运行所用时间和下载的数据量都不同。
我在网上看到一些关于 nginx 在使用 HTTP/2 时出现问题的讨论,所以我使用 HTTP/1.1 重新尝试了这些测试。结果相同。较小的文件和 Web UI 工作正常,但通过curl
、Web UI 或 nextcloud 客户端下载大文件时会崩溃。
nginx 是否存在一些已知问题?同样的系统曾经与 Docker 上的 Apache 一起工作,只有当我迁移到 Kubernetes 上的 nginx 时才会出现。
答案1
我将nginx-ingress-controller
部署升级到quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.22.0
,其中包括 nginx/1.15.8,问题就消失了。请参阅更新日志了解具体情况。