`

Nginx返回411错误

 
阅读更多

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常见错误及解决方法.doc

    当 PHP 脚本的执行时间超过这两个值时,PHP-FPM 会终止脚本的执行,并断开与 Nginx 的连接,导致 Nginx 返回 502 错误。 解决方法是调整 php.ini 和 php-fpm.conf 文件中的 max_execution_time 和 request_...

    php curl nginx 499 错误

    如果客户端在keepalive超时后没有发送新的请求,Nginx可能会关闭连接并返回499错误。检查`keepalive_timeout`配置是否适当。 3. **客户端资源限制**:如果你的PHP脚本运行时间过长或者消耗过多资源,可能会导致...

    Nginx越界读取缓存漏洞 CVE-2017-7529

    如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,...

    nginx自定义404错误页面设置方法.docx

    默认情况下,Nginx 会返回一个标准的404错误页面,但是这并不是很友好。通过自定义404错误页面,可以提供更多的信息和帮助用户快速解决问题。 二、自定义404错误页面的方法 要自定义404错误页面,需要在 Nginx ...

    Nginx服务器中403 forbidden的错误如何解决.docx

    Nginx服务器中403 forbidden的错误如何解决 在 Nginx 服务器中,403 Forbidden 错误是非常常见的错误之一。这种错误通常是由于服务器端的配置错误或权限不正确所导致的。在本文中,我们将详细探讨 Nginx 服务器中 ...

    详解Nginx服务器中配置超时时间的方法

    如果在此时间内无法建立连接,Nginx会返回502 Bad Gateway错误。默认值通常是75秒,但你可以根据实际需求调整。 2. **fastcgi_read_timeout**: 它定义了Nginx等待FastCGI进程返回响应的超时时间。如果超过这个时间...

    nginx的try_file命令实现404跳转_nginx_tryfile404_

    这样,当找不到请求的文件时,Nginx就会将请求转向`/error`这个URI,你可以在`/error`对应的配置中处理404错误,如返回一个定制的404页面。 除了基本的文件检查和重定向,`try_files`还可以配合其他Nginx指令进行更...

    Nginx中定义404页面并且返回404状态码的正确方法

    然而,这种方式会导致Nginx返回200状态码,因为它是将404错误转换为一个成功的HTTP响应。 为了解决这个问题,我们需要修改`error_page`指令,让它同时返回正确的404状态码和404错误页面。正确的配置如下: ```...

    详解nginx请求头数据读取流程

    如果客户端发送的请求头超过了`large_client_header_buffers`配置项所设定的大小限制,Nginx会返回错误,拒绝处理该请求。 2. 请求头解析:Nginx遍历缓冲区中的数据,查找name-value对。每个请求头由一个名称和一个...

    nginx-1.19.6_nginx-http-flv-module(64位)

    - **html**: 存放默认的静态网页文件,当用户访问未定义的URL时,Nginx会返回此目录下的内容。 - **contrib**: 提供额外的模块和工具,供开发者使用和扩展Nginx功能。 - **temp**: 临时文件夹,Nginx在此存储处理...

    Nginx面试专题及答案.pdf

    关于错误处理,可以使用`fastcgi_intercept_errors`指令配合`error_page`指令将Nginx的错误代码转换为其他HTTP状态码,例如将502错误转换为503错误。 对于URL中的双斜线,使用`merge_slashes`指令可以控制是否在URL...

    Nginx日志分析工具2.1.0.zip

    Nginx日志主要分为两种类型:访问日志(access.log)和错误日志(error.log)。访问日志记录了客户端对服务器的所有请求,包括请求时间、客户端IP、请求方法、请求URL、HTTP状态码、返回字节数等信息,这对于理解...

    nginx1.8.1

    2. **错误页定制**:配置 error_page 指令,可以为特定的错误状态码返回自定义的错误页面。 3. **SSL/TLS 安全**:Nginx 支持 SSL/TLS 加密,可以配置证书和密钥,确保数据传输安全。 4. **限速与限流**:通过 limit...

    nginx1.0.4 配置

    **Nginx 1.0.4 配置详解** Nginx 是一款高性能的 Web 和反向代理服务器,以其轻量级、高并发、稳定性好而著名。在这个主题中,我们将深入探讨 Nginx 1.0.4 版本的配置文件 `nginx.conf` 的相关知识,以及如何进行...

    nginx-upload-progress模块源码

    `nginx-upload-progress` 模块就是这样一种解决方案,它允许 Nginx 在处理文件上传时返回实时的上传进度信息。 **模块介绍** `nginx-upload-progress` 模块是专为 Nginx 设计的,用来跟踪并报告文件上传的进度。这...

    window下nginx配置

    }`:指定根路径下的请求应返回的内容。 #### 五、常见问题及解决方法 1. **启动失败**: - 检查`nginx.conf`配置文件是否正确无误。 - 使用命令`nginx -t`检查配置文件的有效性。 - 查看`logs/error.log`文件...

    Nginx模块源码 nginx-notice-2

    对于"nginx-notice-2"模块,如果它处理POST请求后返回特定的通知,那么我们需要在配置文件中定义相应的location块,指明这个模块应当处理哪些请求。此外,可能还需要设置日志记录、错误处理和其他高级特性,以便于...

    Nginx文件上传模块配置

    这里,`client_max_body_size`设置了允许的最大上传文件大小,`upload_pass`指定了处理文件上传的内部location,`upload_set_form_field`用来设置上传文件的相关信息,`upload_cleanup`定义了错误发生时的清理行为...

    nginx-1.10.2

    6. **日志管理**:Nginx 的日志文件默认存储在 `/var/log/nginx/` 目录下,包括访问日志和错误日志。 7. **安全与优化**:为了保障服务器安全,应定期更新Nginx到最新版本,避免已知漏洞,并根据实际需求调整配置以...

    nginx-1.22.1

    Nginx允许通过配置文件定义错误页面,当遇到404、500等错误时,可以返回自定义的页面,提高用户体验。使用`error_page`指令指定错误代码和对应的文件路径。 七、URL重写 Nginx的`rewrite`模块允许进行URL重写,...

Global site tag (gtag.js) - Google Analytics