我正在使用Nginx作为Node.js的反向代理。我有一条允许上传jpg和png图像的路线。路由处理程序检查请求的前几个字节中的幻数,以确保文件格式正确。如果文件格式无效,我想立即响应客户端,而不是浪费资源来处理其余的上传请求。当前,如果收到无效的上传请求,我会立即以“ Connection:close”标题和415状态进行响应。
问题在于Nginx似乎不喜欢这样。我第一次从客户端发送无效请求时,客户端正确地从服务器收到“连接:关闭” 415响应,但是如果我继续发出无效请求,则绝大多数响应会导致“ 502错误的网关”来自Nginx(即客户端从不从Node.js服务器接收响应)。对于这些“ 502 Bad Gateway”响应,Nginx错误日志显示“ * 23 sendfile()失败(32:管道断开),同时向上游发送请求”错误。
我花了一些时间研究这个Nginx错误,这是由于服务器在关闭所有数据发送/从客户端读取之前关闭了连接而导致的。我仍然不明白为什么这个错误永远不会在第一个无效请求上发生(仅在随后的无效上传请求上)。我尝试将keepalive_timeout设置为0(以防止Nginx覆盖“ Connection:close”标头),并且也一直在使用lingering_close无效。
我尝试过的唯一有效的方法是在发送响应/关闭连接之前读取Node中的所有数据。不过,这似乎是一种完全的浪费,因为我只是为了读取数据而读取数据,然后立即将其丢弃。
是否有一种类似的方法来处理无效的上载请求?是否有一种配置Nginx来对客户端进行正常响应的方法,还是建议尽管效率低下,还是在发送响应之前先读取所有数据?