有反向代理( Nginx )时 Hessian 的 411 错误解决方案

来源:互联网 发布:淘宝大数据在哪里看 编辑:程序博客网 时间:2024/05/17 03:46

Hessian 是个轻量级的跨平台的远程过程调用框架(RPC)。我在目前的项目中使用其 java 服务器端和 iOS 客户端(HessianKit)。

在项目开发过程中 HessianKit 能顺利的从服务器获取数据,但是在公司外网测试环境中就会得到 411 的错误代码。经查找该问题发生在 Nginx,因为在开发环境中客户端直接连接 Tomcat,而在测试环境中则有 Nginx 作负载均衡。

原因:

首先来看下HTTP 411错误的解释: LengthRequired 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)这是因为Hessian与服务端通信默认是采取分块的方式(chunked encoding)发送数据,而反向代理要获得Content-Length这个头,才能处理请求,但是Hessian的请求中并没有加入这个参数。【引自博客A】

博客A中对该问题的解决方案是调用 HessianProxyFactory 实例的setChunckedPost() 方法,赋值为false,让其不采用分块传输。不过这样的方案并不适合我,因为我用的是 iOS 平台的 Hessian 客户端 HessianKit 。而 HessianKit 并没有提供这个接口。据我对 HessianKit 源码的简单了解,它采用 NSMutableURLRequest 来进行网络访问,而 iOS SDK 中也并没有提供设置是否分块的功能。因此对我来说最好从 Nginx 端来解决,也是为了多平台的考虑,不希望以后每个客户端都去折腾一遍。

解决方案:

最终通过【博客B】找到解决方案,通过加入新的模块,重新编译并配置 Nginx,完美解决。

我将编译步骤记录在了我的另一篇博客中,详细请参考【我的博客】


参考博客:

【博客A】http://blog.csdn.net/zhtang0526/article/details/4793157

【博客B】http://blog.chinaunix.net/uid-16974460-id-296023.html

【我的博客】http://blog.csdn.net/fangzhangsc2006/article/details/8122273


原创粉丝点击