今天提交一个form的时候遇到一个411错误, 当时我就孤陋寡闻, 第一次见到411, 查了一下然后就囧了, 是nginx直接把请求给弹回来了. 深入的查一下之后发现这个问题还是非常容易引起的, 于是我当时很奇怪的是在之前的开发中难道从来没有遇到过? 话说也是不良习惯造成的问题, 生产环境测试环境都没有nginx, 唯独产品服务器上是, 糟糕吧.
引发411的原因
nginx给出的官方解释有三种情况会引发nginx弹411回去
- client sent invalid “Content-Length” header
- client sent … method without “Content-Length” header
- client sent “Transfer-Encoding: chunked” header
我的场景是这样的, 用httpclient4(java)去调用一个api服务, 这个api使用的server正是nginx, 使用multipart提交图片文件的时候因为它忽略或省略了文件的真正的长度, 所以(通过firebug发现)在request header里就压根没有Content-Length. 那显然符合上面的第二种情况.
改代码
然后我尝试通过修改代码来解决, 自己填充这个header, 但是httpclient很硬气, 我写了一句
1
|
|
它直接就报错了
1
|
|
看来想在包外面改还不是那么容易, 算了, 继续Google, 一定有合理的办法. 不用改代码.
重新编译nginx
于是Google了一圈又看到了这个文章, 遇到同样的问题, 只是它是上面说到的第三种情况, 不过很幸运的是我意识到解决的方法可能是一样的 — 给nginx加上一个Chunkin模块. 说干就干, 参考了nginx的wiki和这篇文章, 可以顺利的加上外部的模块. 简单来说是以下几步:
-
下载新版nginx(或者你还有原来的nginx代码在?), 并下载nginxHttpChunkinModule, 然后解压缩. (下载地址就不帖了, 前者版本更新很快, 后者最近又在开始更新支持DELETE方法了)
-
nginx -V
查一下之前编译nginx时候的参数, 并且记下来 -
./configure
并加上一堆参数, 尤其记得要加上--add-module=/path/to/your/module
-
make
(不要马上make install
)
不停掉nginx, 平滑过渡到新版本
这才是最最技术的活… 参考<实战nginx>(in action), 可以简单归纳为以下几步
-
备份原来的nginx可执行文件, 比如nginx_bak
-
cp obj/nginx
到旧的nginx可执行文件的位置, 因为它还在跑所以要加上参数-f
-
kill -USR2 旧版本的nginx主进程号
(用ps aux | grep nginx
找到, 除了主进程还有一个worker process), 之后再ps会发现一个新的nginx进程被启动, 并且一个新的worker process也开始启动. 这个时候它们同时在工作. -
kill - WHINCH 旧版本的nginx主进程号
这会让旧的nginx进程不再处理新的请求, 过一段时间之后再ps, 会看到旧的worker process已经消失停止了. 这时候所有的请求都交给新的nginx在处理了. -
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 |
|
这样改过之后reload nginx就可以正常工作了, 详细配置方法请参考wiki谢谢.
那么做到这里之前的问题就解决了, 记录一下, 因为在其他环境下都没遇到类似问题.
以上
相关推荐
当 PHP 脚本的执行时间超过这两个值时,PHP-FPM 会终止脚本的执行,并断开与 Nginx 的连接,导致 Nginx 返回 502 错误。 解决方法是调整 php.ini 和 php-fpm.conf 文件中的 max_execution_time 和 request_...
如果客户端在keepalive超时后没有发送新的请求,Nginx可能会关闭连接并返回499错误。检查`keepalive_timeout`配置是否适当。 3. **客户端资源限制**:如果你的PHP脚本运行时间过长或者消耗过多资源,可能会导致...
如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,...
默认情况下,Nginx 会返回一个标准的404错误页面,但是这并不是很友好。通过自定义404错误页面,可以提供更多的信息和帮助用户快速解决问题。 二、自定义404错误页面的方法 要自定义404错误页面,需要在 Nginx ...
Nginx服务器中403 forbidden的错误如何解决 在 Nginx 服务器中,403 Forbidden 错误是非常常见的错误之一。这种错误通常是由于服务器端的配置错误或权限不正确所导致的。在本文中,我们将详细探讨 Nginx 服务器中 ...
如果在此时间内无法建立连接,Nginx会返回502 Bad Gateway错误。默认值通常是75秒,但你可以根据实际需求调整。 2. **fastcgi_read_timeout**: 它定义了Nginx等待FastCGI进程返回响应的超时时间。如果超过这个时间...
这样,当找不到请求的文件时,Nginx就会将请求转向`/error`这个URI,你可以在`/error`对应的配置中处理404错误,如返回一个定制的404页面。 除了基本的文件检查和重定向,`try_files`还可以配合其他Nginx指令进行更...
然而,这种方式会导致Nginx返回200状态码,因为它是将404错误转换为一个成功的HTTP响应。 为了解决这个问题,我们需要修改`error_page`指令,让它同时返回正确的404状态码和404错误页面。正确的配置如下: ```...
如果客户端发送的请求头超过了`large_client_header_buffers`配置项所设定的大小限制,Nginx会返回错误,拒绝处理该请求。 2. 请求头解析:Nginx遍历缓冲区中的数据,查找name-value对。每个请求头由一个名称和一个...
- **html**: 存放默认的静态网页文件,当用户访问未定义的URL时,Nginx会返回此目录下的内容。 - **contrib**: 提供额外的模块和工具,供开发者使用和扩展Nginx功能。 - **temp**: 临时文件夹,Nginx在此存储处理...
关于错误处理,可以使用`fastcgi_intercept_errors`指令配合`error_page`指令将Nginx的错误代码转换为其他HTTP状态码,例如将502错误转换为503错误。 对于URL中的双斜线,使用`merge_slashes`指令可以控制是否在URL...
Nginx日志主要分为两种类型:访问日志(access.log)和错误日志(error.log)。访问日志记录了客户端对服务器的所有请求,包括请求时间、客户端IP、请求方法、请求URL、HTTP状态码、返回字节数等信息,这对于理解...
2. **错误页定制**:配置 error_page 指令,可以为特定的错误状态码返回自定义的错误页面。 3. **SSL/TLS 安全**:Nginx 支持 SSL/TLS 加密,可以配置证书和密钥,确保数据传输安全。 4. **限速与限流**:通过 limit...
**Nginx 1.0.4 配置详解** Nginx 是一款高性能的 Web 和反向代理服务器,以其轻量级、高并发、稳定性好而著名。在这个主题中,我们将深入探讨 Nginx 1.0.4 版本的配置文件 `nginx.conf` 的相关知识,以及如何进行...
`nginx-upload-progress` 模块就是这样一种解决方案,它允许 Nginx 在处理文件上传时返回实时的上传进度信息。 **模块介绍** `nginx-upload-progress` 模块是专为 Nginx 设计的,用来跟踪并报告文件上传的进度。这...
}`:指定根路径下的请求应返回的内容。 #### 五、常见问题及解决方法 1. **启动失败**: - 检查`nginx.conf`配置文件是否正确无误。 - 使用命令`nginx -t`检查配置文件的有效性。 - 查看`logs/error.log`文件...
对于"nginx-notice-2"模块,如果它处理POST请求后返回特定的通知,那么我们需要在配置文件中定义相应的location块,指明这个模块应当处理哪些请求。此外,可能还需要设置日志记录、错误处理和其他高级特性,以便于...
这里,`client_max_body_size`设置了允许的最大上传文件大小,`upload_pass`指定了处理文件上传的内部location,`upload_set_form_field`用来设置上传文件的相关信息,`upload_cleanup`定义了错误发生时的清理行为...
6. **日志管理**:Nginx 的日志文件默认存储在 `/var/log/nginx/` 目录下,包括访问日志和错误日志。 7. **安全与优化**:为了保障服务器安全,应定期更新Nginx到最新版本,避免已知漏洞,并根据实际需求调整配置以...
Nginx允许通过配置文件定义错误页面,当遇到404、500等错误时,可以返回自定义的页面,提高用户体验。使用`error_page`指令指定错误代码和对应的文件路径。 七、URL重写 Nginx的`rewrite`模块允许进行URL重写,...