Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1676927
  • 博文数量: 391
  • 博客积分: 8464
  • 博客等级: 中将
  • 技术积分: 4589
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-13 15:12
个人简介

狮子的雄心,骆驼的耐力,孩子的执著!

文章分类

全部博文(391)

文章存档

2023年(4)

2018年(9)

2017年(13)

2016年(18)

2014年(7)

2013年(29)

2012年(61)

2011年(49)

2010年(84)

2009年(95)

2008年(22)

分类: LINUX

2011-03-04 17:45:38

引发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

重新编译nginx

简单来说是以下几步:

  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 –WINCH 旧版本的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就可以正常工作了, 详细配置方法请参考.

阅读(4430) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~