【发布时间】:2012-04-13 23:48:12
【问题描述】:
我在通过配置为代理的 Apache 将文件发送到使用 Mongoose 网络服务器的本地应用程序时遇到问题。
我的设置:
Apache(端口 80) mod_proxy Mongoose(端口 9090)
mod_proxy 被配置为将某些 URL 从端口 80 传输到 localhost:9090。
Mongoose 只接受经过身份验证的响应。这适用于正常(小)请求。但是,对于大文件传输,Apache 返回 502 Bad Gateway 响应。
发生的事情(嗯,实际上只是我对发生的事情的分析)是,当我们的客户端(.net 客户端,预计启用 100)尝试发送文件时,它会直接发送标题,然后是文件的内容。
Mongoose 收到传输的标头,检测到它没有经过身份验证并返回 401 Unauthorized 并关闭连接。现在 Apache(仍在接收和处理文件传输)无法再转发数据并返回 502 Bad Gateway(代理服务器收到来自上游服务器的无效响应)。
在外部接口上嗅探时,我看到 .net 客户端发送标头,然后在 20 毫秒内发送内容,但没有收到 100 Continue。接收完成后,Apache 返回 502。
当嗅探内部接口时,我看到标头和正文组合成一个 16384 字节的 tcp 数据包。 Mongoose 在几毫秒内回复 401 并关闭连接。
看起来 Apache 检测到连接的关闭,但忽略了 401 并且不转发。是否有可能让 Apache 正确转发 401 而不是回复 502?
目前,我将应用程序更改为仅在检测到 401 时从连接中读取所有数据,但这只是一种解决方法,因为这归结为发送完整文件两次。由于文件可能有数百兆字节,这会给我们的系统带来相当大的压力。
我们在 ARM 系统上使用 Apache 2.2.9 (Debian)。
【问题讨论】: