solrj 客户端请求 nginx 411错误

开始一直使用jboss/jetty 来运行solr服务,一直很正常,今天在前面加了一个nginx,突然间,提交add/update document都没反映了,第一反应是是否服务有问题呢,看solr 服务端日志,发现少了一些日志打印,add部分没有,debug solr服务端跟踪,发现请求过来的document参数为空。然后再看solrj客户端代码,发现每次都需要调两次服务端,一次发送数据,一次提交commit,而每次发送数据的时候都会返回socket broke pipe, 这是想到看看请求是否有到达服务端,debug服务端发现只有一次请求,且是commit参数的那次请求有到达。
这时才想起来,去看nginx,发现这样的报错:

"POST http://xxxxx/solr/core1/update?wt=javabin&version=2" 411 649 "-" "Solr[org.apache.solr.client.solrj.impl.HttpSolrServer] 1.0"


这就很明显了411错,原来是被nginx拦截且报错返回了, 411报错有一下这些原因:

nginx给出的官方解释有三种情况会引发nginx弹411回去
client sent invalid “Content-Length” header
client sent … method without “Content-Length” header
client sent “Transfer-Encoding: chunked” header


且这里有解决方案:
http://wiki.nginx.org/HttpChunkinModule

配置
会绕过nginx ngx_http_process_request_header 方法中对以上三种情况的检查

但是发现我nginx版本不支持HttpChunkinModule,先记着,等我升级了再来确认是否有效。

这边也找到类似的文章:http://artori.us/nginx-411-error/

你可能感兴趣的:(solr)