现在的位置: 首页fault, nginx>正文
nginx 411 Content-Length required errors
2012年11月07日 fault, nginx 暂无评论 ⁄ 被围观 4,792 view+

今天提交一个form的时候遇到一个411错误, 当时我就孤陋寡闻, 第一次见到411, 查了一下然后就囧了, 是nginx直接把请求给弹回来了. 深入的查一下之后发现这个问题还是非常容易引起的, 于是我当时很奇怪的是在之前的开发中难道从来没有遇到过? 话说也是不良习惯造成的问题, 生产环境测试环境都没有nginx, 唯独产品服务器上是, 糟糕吧.

引发411的原因

nginx给出的官方解释有三种情况会引发nginx弹411回去

  1. client sent invalid “Content-Length” header
  2. client sent … method without “Content-Length” header
  3. client sent “Transfer-Encoding: chunked” header

我的场景是这样的, 用httpclient4(java)去调用一个api服务, 这个api使用的server正是nginx, 使用multipart提交图片文件的时候因为它忽略或省略了文件的真正的长度, 所以(通过firebug发现)在request header里就压根没有Content-Length. 那显然符合上面的第二种情况.

解决办法

添加chunkin-nginx-module模块

下载地址:https://github.com/agentzh/chunkin-nginx-module/tags

编译的时候加入这个模块

./configure  --user=nginx --group=nginx --add-module=../ngx_cache_purge-1.2 --prefix=/usr/local/nginx --with-http_sub_module --with-http_ssl_module --with-http_realip_module --with-debug --with-http_stub_status_module --add-module=/usr/local/src/agentzh-chunkin-nginx-module-847b3de/
make -j2
make install

修改如下配置

server {
	chunkin on;

	error_page 411 = @my_411_error;
	location @my_411_error {
		chunkin_resume;
	}

	listen 8080;
	location / {
		proxy_set_header Host $host;
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_pass http://backend;
	}

}

参考

http://wiki.nginx.org/HttpChunkinModule

http://www.l99.com/1548156/blog/view/283241

给我留言

留言无头像?


×
腾讯微博