Apache 使用 mod_proxy 和大文件返回 502 Bad Gateway
Posted
技术标签:
【中文标题】Apache 使用 mod_proxy 和大文件返回 502 Bad Gateway【英文标题】:Apache returns 502 Bad Gateway with mod_proxy and large file 【发布时间】: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)。
【问题讨论】:
【参考方案1】:您可能遇到了此处提交的 Apache 错误 https://bz.apache.org/bugzilla/show_bug.cgi?id=55433
相关链接:
http://osdir.com/ml/bugs-httpd/2013-08/msg00119.html http://osdir.com/ml/bugs-httpd/2013-08/msg00094.html http://dev.eclipse.org/mhonarc/lists/jetty-users/msg04580.htmlPS:我遇到了同样的问题,这是一个相当晦涩的错误(既要查找有关它的信息,又要查找错误本身)。 FWIW,nginx 不呈现相同的行为。
【讨论】:
感谢您给出这个答案。我遇到了同样的问题,确实,提供实际响应的 Jetty 确实回复了 401,Apache 将其翻译为 502。 @d'Scribe 自 2013 年以来已报告此错误(可能在此之前存在多年),但仍未修复。您的选择是有限的,并且趋向于切换到另一个反向代理,例如nginx.以上是关于Apache 使用 mod_proxy 和大文件返回 502 Bad Gateway的主要内容,如果未能解决你的问题,请参考以下文章
apache 到 tomcat:mod_jk 与 mod_proxy
apache tomcat + apache httpd + mod_proxy + mod_rewrite + 表单发布数据