2012-03-30 69 views
4

通过配置为使用Mongoose Web服务器的本地应用程序的代理的Apache发送文件时,发现问题。Apache使用mod_proxy和大文件返回502错误网关

我的设置:

的Apache(端口80)< - >的mod_proxy < - >猫鼬(端口9090)

mod_proxy的被配置成从端口80传送某些URL为localhost:9090 。

猫鼬只接受认证的响应。对于正常(小)请求,这可以正常工作。但是,对于大文件传输,Apache将返回一个502 Bad Gateway响应。

发生了什么(好吧,实际上我只是分析发生了什么)是当我们的客户端(一个.net客户端,期望100启用)尝试发送文件时,它会直接发送文件头中的文件头。

Mongoose收到传输的标题,检测到它没有通过身份验证,并返回401 Unauthorized并关闭连接。现在,Apache(仍在接收和处理文件传输)不能再转发数据,并返回502 Bad Gateway(代理服务器收到来自上游服务器的无效响应)。

当在外部接口上嗅探时,我发现.net客户端发送标头,在20毫秒内接收到内容,而没有收到100继续。当接收结束时,Apache返回502.

当嗅探内部接口时,我看到标题和正文组合成一个16384字节的tcp数据包。 Mongoose会在几个msecs内用401回复并关闭连接。

它看起来像Apache检测到连接关闭,但忽略401并不转发此。是否有可能让Apache正确转发401而不是用502回复?

目前我改变我们的应用程序,只是从连接中读取所有数据,如果401被检测到,但这只是一个解决方法,因为这涉及到发送完整的文件两次。由于这些文件可能有数百兆字节,因此可能给我们的系统带来相当大的压力。

我们在ARM系统上使用Apache 2.2.9(Debian)。

回答

4

你可能遇到了Apache的错误这里https://bz.apache.org/bugzilla/show_bug.cgi?id=55433

相关链接申请:

PS:我已经打了相同问题,这是肆意的呃一个晦涩的bug(既可以找到它的信息,也可以找到错误本身)。 FWIW,nginx不具有相同的行为。

+0

感谢您给出这个答案。我有同样的问题,事实上,提供实际响应的Jetty确实回复了一个由Apache翻译为502的401。 – ctron 2016-03-03 12:21:56

+0

如何解决这个错误 – 2018-02-09 11:23:36

+0

@ d'Scribe这个错误自2013年以来已有报道(可能在此之前存在很多年),并且仍然没有修复。您的选择受到限制,并趋于切换到另一个反向代理,例如nginx的。 – 2018-02-12 11:48:36