给文件上传业务选InterServer VPS时,看到CPU和内存够用,还不能直接下单。用户的一份大文件可能先在反向代理处完整暂存,再进入应用;并发增加后,临时盘和后端连接会先于计算资源成为瓶颈。采购前值得做的,是把“文件经过哪里、在哪一段等待、失败以后从哪里重来”画清楚,再决定资源升档是否有效。本篇讨论Nginx反向代理的资源取舍,没有对InterServer实例做上传性能实测。
Nginx官方文档给出的proxy_request_buffering默认值为on。开启时,代理先从客户端读取完整请求体,之后才向上游发送;关闭时,则随着接收过程立即转发。这里讨论的是上传请求体,决定响应如何返回的proxy_buffering属于另一项配置,两者不能互相替代。[2]
假设一个请求体为1.5GiB,用户到代理、代理到应用的有效传输速率恰好都为20Mbit/s,而且两段串行、没有其他开销。按二进制GiB换算,单段理论传输时间约644.25秒,两段合计约1288.49秒。这个例子只解释等待从何而来,不是任何商家的测速结果。现实中两段速率不同,应用还可能进行校验、扫描和持久化,提交成功的时间通常不能只看客户端进度条。
流式转发允许两段在时间上重叠,但并不保证速度翻倍。较慢的一段仍会限制吞吐,后端若不能及时消费,请求会沿连接产生背压。关闭缓冲改变的是资源占用和处理时序,不能凭一个开关承诺上传提速。如果应用最终仍把整个文件读入内存,再开始处理,代理端节省的等待可能只是转移到了应用内部。

对于允许先收齐文件、再统一处理的后台任务,完整缓冲可能有价值:慢速客户端主要占用代理侧资源,应用在请求体准备好以后再接手。不过,代理盘必须承担暂存峰值,上传完成也不等于业务已经确认接收。页面提示应该区分“已传完”和“已保存”,避免用户在后端还未完成操作时退出。
Nginx的client_body_temp_path用于保存客户端请求体临时文件。[3] 它可能与系统、应用和数据库共享文件系统,也可能单独挂载。决定风险的不是硬盘宣传容量,而是这个具体路径所在文件系统还剩多少空间、应用是否还会再写一份,以及失败请求能否及时结束和释放资源。
仍以假设场景计算:十二个1.5GiB请求同时达到接近完整暂存状态,仅代理这一层请求体就可能接近18GiB,尚未计入应用副本、系统文件和预留空间。这个数字不是“每次上传必占双份”的结论。应用若采用移动文件、流式处理或直接写入其他存储,占用路径会不同;采购人员应让部署者确认实际实现,不能凭框架名称推定。
用单次成功上传测容量容易漏掉尾部占用。最慢的一批请求尚未释放,下一批已经开始;应用重试又可能产生第二份文件。验收时应该同时记录峰值并发、临时路径可用空间、应用目录增长、失败请求数和最终成功数。磁盘看似够用但响应变慢,还要结合写入延迟和应用等待判断,不能直接把问题归为容量不足。
client_max_body_size约束客户端请求体大小,超过配置值会返回413;设置为0则关闭这项大小检查。client_body_timeout衡量读取请求体时相邻两次读取之间的等待,并非整个上传允许的总时长。[3] 因此,把超时写成较大数字,并不能推导出服务已经具备对应时长的可靠上传能力,也不能用它代替文件大小限制。
应把文件上限写到具体业务入口,并同时核对应用、前置网关和存储端的限制。假设业务允许单文件1GiB,请求体还可能含有表单封装开销,不能不加区分地把请求体上限设成文件净大小。对慢速上传的保护也需要连接数、身份校验和业务并发控制共同参与,单项配置无法回答整台机器会被占用多久。
关闭请求缓冲后,上游更早参与传输。假设应用每个上传占用一个工作进程,慢客户端持续十分钟,就可能让这个进程十分钟内无法处理其他任务;如果上传与普通接口共用有限工作池,页面查询也会一起排队。这是一个依赖应用模型的情景,异步服务器或独立上传服务可能表现不同,不能把它写成所有框架的必然行为。

官方文档还指出,关闭请求缓冲且已向上游发送请求体后,该请求不能再交给下一个服务器。文档对客户端采用HTTP/1.1分块传输也列出了额外条件:若代理侧没有启用HTTP/1.1或HTTP/2,请求体仍会缓冲。[2] 应核对实际版本和生效配置,不能把配置文件里出现off当成端到端流式工作的证据。
这会影响失败后的设计。一次传到一半的请求,不应由前端在没有业务约束的情况下无限重试;否则同一文件可能形成重复任务,甚至重复计费。上传凭据、文件标识、完成确认和过期清理需要协同。断点续传也必须由相应协议和应用实现,代理切换服务器并不会自动赋予这项能力。
如果采购理由只是“关闭缓冲就能省掉大硬盘”,还缺了一份后端并发与失败恢复预算。对经常上传大文件的业务,可以评估让客户端按受限授权直接写入对象存储,应用只处理元数据和完成通知;这会增加签名权限、跨域配置、回调校验和存储请求费用,是否划算仍取决于现有业务和维护能力。
不宜直接改线上开关验证猜想。可以在隔离入口准备大文件、慢速连接和中途断开三类请求,分别检查缓冲开启与关闭后的临时盘峰值、应用排队和结果一致性。使用没有敏感内容的测试文件,并限制流量,先确认商家订单是否对高负载和带宽使用另有约束。验收目标应写成可重现的业务条件,而不是追求一次峰值数字。
本次渠道通网站17返回了InterServer推广入口;渠道记录列有云计算与裸机基础设施介绍,但这只是平台资料,不是本次官方订单确认。商家官网在采集时超时,因此这里不列现价、库存、节点、端口保底、退款期限,也不以渠道描述替代合同。需要进一步比较时,可通过查看InterServer方案与实际订单条件(推广链接)进入核对;通过该链接访问可能产生推广佣金,不影响上面的技术边界。
向商家确认的资源项应对应部署方案:临时目录所在磁盘及可扩容方式、实际流量计费口径、可接受的持续写入负载,以及套餐变更会不会中断服务。软件调试和应用数据恢复是否包含在支持范围,也要单独问清。对于官网本次未核实的条件,不能因为过去同品牌文章提过某档产品,就沿用成当前承诺。
总成本还应计入对象存储或额外磁盘、跨服务传输、失败重传以及维护工时。若小规格经过受控测试已经满足文件上限和峰值并发,升档的收益可能很小;若临时盘峰值仍与并发同步增长,单加CPU通常不能解决容量缺口。付款前留下两份可比结果:同一负载下开启缓冲和关闭缓冲时,各自占用多少磁盘、多少后端处理能力,以及失败请求能否安全重来。订单按这份结果选择,资源取舍才有明确依据。
技术依据为本次读取的Nginx官方文档;计算为文内明确假设的理论推导。两张正文图均为概念示意,不是产品界面或测试结果。InterServer渠道快照及本次官网超时证据另存,不视为实时套餐确认。
[2] jsonfile
[3] logging
精彩推荐
用户评论