Nginx Ingress控制器502用于大文件上传的坏网关

时间:2018-03-26 21:47:27

标签: kubernetes kubernetes-ingress

我们最近从nginx入口控制器从0.8.2升级到0.11.0,并开始收到502错误的网关错误 对于大约10 MB或更高的大型文件上传,我们在configmap中通过 proxy-body-size client_max_body_size 设置为 500m 并且验证 它的集合。 5-6 MB左右的较小文件工作正常。

日志中没有错误,只有这些消息。

  

编辑 - [编辑] - - [25 / Mar / 2018:02:08:49 +0000]“POST   / redacted / upload HTTP / 1.1“000 0”https://redacted/“”Mozilla / 5.0   (Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)   Chrome / 65.0.3325.181 Safari / 537.36“3371263 10.850 [uploader-443] ----

  

[warn] 30684#30684:* 42090客户端请求正文被缓冲到   临时文件/ var / lib / nginx / body / 0000000482,客户端:编辑,   server:redacted,request:“POST / redacted / upload HTTP / 1.1”,host:   “编辑”,推荐人:“https://redacted/

代理服务器是tomcat,请求不会进入tomcat。 我们尝试过增加:

  • 超时
  • proxy_buffers
  • proxy_buffer_size

但没有任何效果。

返回 0.8.2 版本可解决此问题。

更新1:nginx.conf片段

  

location / redacted / {

     

port_in_redirect off;

     

设置$ proxy_upstream_name“redacted-443”;

     

...

     

...

     

client_max_body_size“500m”;

4 个答案:

答案 0 :(得分:2)

看起来您可能需要为所有Ingress规则全局设置更大的文件大小。

这可以通过使用 proxy-body-size 参数来实现,即:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    ingress.kubernetes.io/proxy-body-size: 20mb
.... 

之后它适用于大于10MB的文件。

答案 1 :(得分:1)

您是否验证了生成的nginx.conf以查看该值是否已实际设置?我在入口配置中使用了它并且它可以工作(版本0.11)

答案 2 :(得分:1)

我建议使用configmap设置:

  body-size: "1024m"
  proxy-body-size: "1024m"

下面是一个完整的示例:https://github.com/mateothegreat/k8-byexamples-ingress-controller/blob/master/manifests/configmap.yaml

要将配置映射应用于入口控制器部署,您需要将其作为参数传递给容器,例如:https://github.com/mateothegreat/k8-byexamples-ingress-controller/blob/master/manifests/controller-deployment.yaml#L59

答案 3 :(得分:0)

我遇到了同样的问题。在我们的例子中,它是一个使用 uwsgi 运行的 python Django 应用程序,Nginx 设置作为入口控制器。当上传大于 50mb 的文件时,我会得到 502,尽管我已将所有配置添加到入口控制器配置映射中。 事实证明,问题出在 pod 的活跃度探测器上。当一个大文件被发送到作为单线程运行的 uwsgi 服务器的应用程序时,会忙于该请求并且活动检查超时。因此 pod 会重新启动。我通过从部署中删除活跃度检查来对此进行测试,并且文件上传没有任何问题。