【发布时间】:2017-01-30 06:20:32
【问题描述】:
考虑我们当前的架构:
+---------------+
| Clients |
| (API) |
+-------+-------+
∧
∨
+-------+-------+ +-----------------------+
| Load Balancer | | Nginx |
| (AWS - ELB) +<-->+ (Service Routing) |
+---------------+ +-----------------------+
∧
∨
+-----------------------+
| Nginx |
| (Backend layer) |
+-----------+-----------+
∧
∨
----------------- +-----------+-----------+
File Storage | Gunicorn |
(AWS - S3) <-->+ (Django) |
----------------- +-----------------------+
当客户端、移动设备或 Web 尝试在我们的服务器上上传大文件(超过 1 GB)时,通常会遇到空闲连接超时。来自他们的客户端库,例如在 iOS 上,或者来自我们的负载均衡器。
当客户端实际上传文件时,不会发生超时,因为连接不是“空闲”的,正在传输字节。但是我认为当文件已经传输到 Nginx 后端层并且 Django 开始将文件上传到 S3 时,客户端和我们的服务器之间的连接会变得空闲,直到上传完成。
有没有办法防止这种情况发生?我应该在哪一层解决这个问题?
【问题讨论】:
-
你在 NGINX conf 中设置了 client_max_body_size 吗?
-
什么系统触发了超时? ELB还是别的什么? ELB 默认为 60s,但它是可配置的。
-
在这种情况下,是客户端超时
-
能否列出你已经在各个级别调整的所有超时相关设置?
-
@Michael-sqlbot 我已经将该值增加到 20 分钟,但我认为这很骇人听闻,因为等待大文件从我们的服务器上传到 S3 的操作不应被视为“闲置的”。此外,我无法控制客户端的空闲超时,所以这不能完全解决问题。谢谢
标签: django nginx amazon-s3 gunicorn amazon-elb