我有一个在 nginx 上运行的节点服务器作为反向代理,它应该处理图像上传。它的 SSL 证书和域是通过 cloudflare 配置的。
除了设置 proxy_pass 将 443 请求传递到 localhost 上的节点外,我没有对默认配置进行太多更改。我在 http 块底部设置的更值得注意的 nginx 指令是:
# Disabled nginx testing for overweight requests - handled in node
client_max_body_size 0;
# Request and response buffering disabled - to try and be able to reject overweight requests in node ASAP
proxy_request_buffering off;
proxy_buffering off;
# Enabled to avoid buffering http 1.1 chunked if sent
proxy_http_version 1.1;
# Disabled writing responses to a file
proxy_max_temp_file_size 0;
无论使用哪种客户端 - postman/insomnia/axios - 当通过 http 发送以 4MB 图像作为属性之一的表单数据请求时,请求大约在 100 毫秒后到达第一个节点中间件,这很好。但是,当通过 https 发送相同的请求时,大约需要 4 秒才能到达第一个节点中间件。4 秒大约是发送整个请求(文件)所需的时间。
当向返回 200 OK 响应的简单端点发送 GET 请求时,http 和 https 调用花费相似的时间来解析 - 彼此相差 100 毫秒以内 - 其中 http 稍快一些。这使我相信在发送表单数据请求时观察到的巨大开销是由于 https 请求在被 nginx 接收时没有立即传递给节点服务器造成的。
当我启用 nginx 时客户端最大主体大小指令并将其设置为 ie256千。出现了相同的问题 - http 调用在合理的约 100 毫秒后被 nginx 拒绝,并出现 413 响应,而 https 请求大约需要 4 秒才会出现 413 拒绝。
我测试了许多不同的指令配置,但没有一个对 https 上传速度有显著影响。目前我已经想不出什么办法了,如果能指点一下是什么原因导致的,以及解决办法是什么,我将不胜感激。谢谢!
答案1
代理缓冲适用于任何方案。
代理缓冲通常会加快整个过程的速度,而不是减慢其速度。
因此我认为你的责备是错误的。
4兆字节的图像大小通常不是一个适合整个想法的图像大小“公共互联网上的图像”,除非您托管一个包含詹姆斯韦伯高分辨率照片的 NASA 网站,否则请缩小它们并确保使用压缩(发送 JPEgs 或为非压缩光栅格式启用压缩)。
我还要确保您正在操作的反向代理正在使用缓存,这样它就不会在每次请求时重新下载这些巨大的图片(开箱即用的 nginx 带有一个已禁用的缓存)。
答案2
我知道问题中有这个问题,但就我而言,我发现这个问题缺少它。
为我添加proxy_http_version 1.1
已修复的问题
按照文档
当使用 HTTP/1.1 分块传输编码发送原始请求体时,无论指令值如何,请求体都将被缓冲,除非启用了 HTTP/1.1 进行代理。