Nginx返回411错误

今天提交一个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. 那显然符合上面的第二种情况.

改代码

然后我尝试通过修改代码来解决, 自己填充这个header, 但是httpclient很硬气, 我写了一句

1
header httppost.setHeader("Content-Length", "0");

它直接就报错了

1
org.apache.http.ProtocolException: Content-Length header already present at org.apache.http.protocol.RequestContent.process(RequestContent.java:67)  ......

看来想在包外面改还不是那么容易, 算了, 继续Google, 一定有合理的办法. 不用改代码.

重新编译nginx

于是Google了一圈又看到了这个文章, 遇到同样的问题, 只是它是上面说到的第三种情况, 不过很幸运的是我意识到解决的方法可能是一样的 — 给nginx加上一个Chunkin模块. 说干就干, 参考了nginx的wiki和这篇文章, 可以顺利的加上外部的模块. 简单来说是以下几步:

  1. 下载新版nginx(或者你还有原来的nginx代码在?), 并下载nginxHttpChunkinModule, 然后解压缩. (下载地址就不帖了, 前者版本更新很快, 后者最近又在开始更新支持DELETE方法了)

  2. nginx -V 查一下之前编译nginx时候的参数, 并且记下来

  3. ./configure 并加上一堆参数, 尤其记得要加上 --add-module=/path/to/your/module

  4. make (不要马上make install)

不停掉nginx, 平滑过渡到新版本

这才是最最技术的活… 参考<实战nginx>(in action), 可以简单归纳为以下几步

  1. 备份原来的nginx可执行文件, 比如nginx_bak

  2. cp obj/nginx到旧的nginx可执行文件的位置, 因为它还在跑所以要加上参数 -f

  3. kill -USR2 旧版本的nginx主进程号 (用ps aux | grep nginx找到, 除了主进程还有一个worker process), 之后再ps会发现一个新的nginx进程被启动, 并且一个新的worker process也开始启动. 这个时候它们同时在工作.

  4. kill - WHINCH 旧版本的nginx主进程号 这会让旧的nginx进程不再处理新的请求, 过一段时间之后再ps, 会看到旧的worker process已经消失停止了. 这时候所有的请求都交给新的nginx在处理了.

  5. kill -QUIT 旧版本的nginx主进程号 退出旧的进程, 新的进程就可以使用了.

当然这个平滑过渡适用版本升级等各种更换nginx可执行文件的情况, 所以再额外提一下如果发现新版本不好要退回去的时候怎么办.

  • kill -HUP 旧的nginx主进程号 不reload配置文件就直接重新启动旧的nginx

  • kill -QUIT 新的nginx主进程号 从容关闭新的Nginx实例

  • kill -TERM 新的nginx主进程号 这个和上面的可以二选一

  • 之后可以把之前的nginx_bak重新复制回来覆盖新的

当然以上都是文明人的做法, 想施暴也是可以的…

修改nginx的配置文件

然后要改一下配置, 使新的模块生效

1
2
3
4
5
6
7
8
9
10
11
12
chunkin on;
error_page 411 = @my_411_error;
location @my_411_error {    chunkin_resume;
}
location /foo {    # your fastcgi_pass/proxy_pass/set/if and
    # any other config directives go here...
}
...

这样改过之后reload nginx就可以正常工作了, 详细配置方法请参考wiki谢谢.

那么做到这里之前的问题就解决了, 记录一下, 因为在其他环境下都没遇到类似问题.

以上

Nginx返回411错误相关推荐

  1. Hessian HTTP POST访问时,Nginx返回411问题

    2019独角兽企业重金招聘Python工程师标准>>> #1 问题描述# 用 Hessian 实现 web service 过程中,需要创建对象时,是使用 HTTP POST 方法来 ...

  2. Nginx反向代理,返回405错误的解决办法

    https://www.linuxidc.com/Linux/2012-07/66760.htm Nginx的405错误解决办法 [日期:2012-07-30] 来源:Linux社区  作者:cnsa ...

  3. nginx 返回状态码详解

    nginx 返回状态码详解 200 (成功) 服务器已成功处理了请求. 通常,这表示服务器提供了请求的网页. 201 (已创建) 请求成功并且服务器创建了新的资源. 202 (已接受) 服务器已接受请 ...

  4. Nginx常见的错误及解决方法

    1.Nginx 常见启动错误 有的时候初次安装nginx的时候会报这样的错误 sbin/nginx -c conf/nginx.conf 报错内容:sbin/nginx: error while lo ...

  5. http 411错误

    今天使用jQuery ajax请求时,使用ie返回正确结果,但是使用Firefox, 出现"411 Length Required" 错误,请求出错. 上网Google了一把,41 ...

  6. https返回400_HTTP请求中带有特殊字符|,返回400错误

    Java平台,服务器是Tomcat8,前端ajax访问服务器时,F12返回400错误,经分析,URL地址中get传参值里面含有"|", Invalid character foun ...

  7. Nginx显示500错误原因和解决方法

    文章目录 1.背景 2.Nginx 常见的几种报错 3. 解决500错误 1.背景 最近在操作nginx 的时候出现了 Nginx 500 内部错误,在此记录一下原因,项目采用的是前后端分离方式,后端 ...

  8. Geoserver禁止返回400错误

      使用Geoserver的瓦片服务时,比如wmts服务,如果不再范围内就会返回400错误,内容是text/xml格式,是一些瓦片行列号不在范围内的信息.   对于大范围内的瓦片我们可以不用关心这类问 ...

  9. php连接数据库404错误代码,访问编码后的中文URL返回404错误的解决方法,url404_PHP教程...

    访问编码后的中文URL返回404错误的解决方法,url404 昨天做一个项目,其中有一个需求是每一张图片对应一小段文字对图片的说明,普通的做法是新建一个表然后把图片名与说明文字都记录到数据库内.仔细考 ...

最新文章

  1. 设备服务器停止运行吗,服务器已停止响应是怎么回事
  2. 20200301 Intel Realsense D435摄像头掉线问题测试数据记录
  3. pandas中一列拆分成两列
  4. 一种全新的点击率建模方案
  5. “Table .__efmigrationshistory doesn’t exist”的解决方案
  6. Electron使用时拦截HTTP请求的解决方案
  7. C#热血传奇游戏服务端再次开源更新
  8. 如何简单访问HTTP的GET、POST、PUT、DELETE,MOCK数据
  9. A guess 解题报告
  10. apkg格式怎么打开_天正软件如何导成CAD识别格式
  11. 微信小程序人脸识别java_微信小程序使用face++实现人脸识别登录注册
  12. Codevs 4246 奶牛的身高
  13. 无线连接中心服务器连接异常,解决Win7/Win8.1的无线网络连接受限故障
  14. 2:STM32CubeMX配置STM32F103C8T6驱动-TIM1配置
  15. POJ1201/ZOJ1508/HDU1384 Intervals(spfa解差分约束问题)
  16. 如何在photoshop里画虚线
  17. 了解什么是枚举(enumeration)
  18. 使用HybridSN进行高光谱图像分类
  19. 28张图解 | 互联网究竟是「如何连接,如何进行通信」的?
  20. 微信小程“古康日记“

热门文章

  1. 大学web基础期末大作业~仿品优购商城页面制作(HTML+CSS+JavaScript)
  2. LTE物理信道PHICH--学习笔记
  3. mosfet驱动电路设计--笔记
  4. swath data 是什么意思
  5. Tensorflow深度学习学习笔记
  6. SEO分析和方案设计
  7. “积微者速成”与敏捷实践
  8. JS原生事件如何绑定
  9. 控制工程中的数学建模(3)——自动控制系统的一般模型
  10. JavaC++题解与拓展——leetcode1823.找出游戏的获胜者【约瑟夫环】