Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1631557
  • 博文数量: 185
  • 博客积分: 10363
  • 博客等级: 上将
  • 技术积分: 2205
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-11 22:29
文章分类
文章存档

2013年(12)

2012年(5)

2011年(2)

2010年(12)

2009年(9)

2008年(15)

2007年(48)

2006年(82)

分类: LINUX

2012-11-29 14:57:30

 对于一个worker,只维护自己的upstream状态表,不存在进程间通讯的问题

本示例中,upstream backend包含5个member,为54-58,连接超时为30秒,其余参数默认(fail_timeout默认10秒)

ERROR LOG:

2012/11/28 22:26:15 [error] 2943#0: *1302597622 no live upstreams while connecting to upstream, client: 117.136.9.124, server: webapps.ccc.com, request: "HEAD /mobile/web/search.jsp?keyword=%AE HTTP/1.1", upstream: "%AE", host: "s.ccc.com"

 

ACCESS LOG:

117.136.9.124 - - [28/Nov/2012:22:26:15 +0800] "HEAD /mobile/web/search.jsp?keyword=%AE HTTP/1.1" 502 0 "-" "Apache-HttpClient/UNAVAILABLE (java 1.4)" s.ccc.com - 11.22.33.57:8080, backend 504, 502 30.009, 0.000 30.009 -

 

22:26:15,记录了一条502,access log显示nginx先尝试从57取数据,30秒后超时,upstream状态表里已经没有up的成员,那么就返回502

据此,这个连接进来的时间应该是30秒前,也就是22:25:45.也就是说,在这个时间点,upstream状态表成员的down标志是在之前10秒内被标记的,一下为日志片段:

# cat error.log |  grep "2012/11/28 22:25" | grep 2943\#|grep "upstream timed out" | perl -n -e '$_ =~ /^([0-9]+\/[0-9]+\/[0-9]+\ [0-9]+:[0-9]+:[0-9]+).*(\ [0-9]+)\#.*client:\ ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*upstream:\ \"http:\/\/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/;print "$1 $2 $4\n";'|grep 11.22.33

2012/11/28 22:25:15  2943 11.22.33.57

2012/11/28 22:25:21  2943 11.22.33.55

2012/11/28 22:25:29  2943 11.22.33.58

2012/11/28 22:25:30  2943 11.22.33.58

2012/11/28 22:25:37  2943 11.22.33.56

2012/11/28 22:25:43  2943 11.22.33.55

2012/11/28 22:25:45  2943 11.22.33.58

2012/11/28 22:25:49  2943 11.22.33.55

2012/11/28 22:25:49  2943 11.22.33.54

2012/11/28 22:25:50  2943 11.22.33.56

2012/11/28 22:25:52  2943 11.22.33.58

2012/11/28 22:25:54  2943 11.22.33.54

2012/11/28 22:25:54  2943 11.22.33.58

2012/11/28 22:25:55  2943 11.22.33.56

2012/11/28 22:25:59  2943 11.22.33.54

黄色区域为45秒往前10秒内被标记成down的成员的标记过程日志,显示只有5457up的。

(为什么在后面还会有同样的成员被标记成down的日志?那是因为,一个连接进来时,如果在30秒超时未结束时,一个新的连接进来了,那么这个upstream成员是不会被标记成down的,只有30秒超时结束后,才会被标记成down,那么,在22:25:45以后被标记成down55,5658再次出现就是这个原因)

# cat error.log |  grep "2012/11/28 22:26" | grep 2943\#|grep "upstream timed out" | perl -n -e '$_ =~ /^([0-9]+\/[0-9]+\/[0-9]+\ [0-9]+:[0-9]+:[0-9]+).*(\ [0-9]+)\#.*client:\ ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*upstream:\ \"http:\/\/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/;print "$1 $2 $4\n";'|grep 11.22.33

2012/11/28 22:26:04  2943 11.22.33.57

2012/11/28 22:26:06  2943 11.22.33.55

2012/11/28 22:26:06  2943 11.22.33.54

2012/11/28 22:26:13  2943 11.22.33.58

2012/11/28 22:26:15  2943 11.22.33.57

2012/11/28 22:26:25  2943 11.22.33.57

2012/11/28 22:26:25  2943 11.22.33.57

2012/11/28 22:26:33  2943 11.22.33.55

2012/11/28 22:26:36  2943 11.22.33.56

2012/11/28 22:26:39  2943 11.22.33.56

2012/11/28 22:26:41  2943 11.22.33.58

2012/11/28 22:26:55  2943 11.22.33.58

 

那为什么access log里只有57出现了?那是因为在22:26:15之前10秒内,54被标记成down,而当57超时后,nginx想去尝试54的时候,发现54状态是down的,所以直接返回的backend 502

绿色区域显示在22:26:155730秒超时结束,被标记成down,从而有了error logaccess log的记录。

 

 

 

 

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