多谢pengqi ,提问时没有说太明白,不好意思:
log_format格式如下:
log_format main '$remote_addr $http_x_forwarded_for $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_cookie" "$request_time" "$upstream_cache_status" "$server_name" "$gzip_ratio" "$host"';
client_header_timeout设置了30s:
client_header_timeout 30s;
下面两种请求都出现了:
113.135.89.1 - - [31/Aug/2012:10:27:19 +0800] "GET /**** HTTP/1.1" 408 0 "http://s.yyy.com/xyz" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)" "-" "5.303" "-" "www.xxx.com" "-" "s.yyy.com"
219.159.151.130 - - [31/Aug/2012:18:01:33 +0800] "GET /**** HTTP/1.1" 200 12379 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; KB974489)" "-" "0.300" "-" "s.yyy.com" "3.13" "s.yyy.com"
还有两个问题不太明白:
1、request_time:5.303s<client_header_timeout:30s
这个是为什咩?
2、如果是nginx在接收到该请求的host头之前就超时了,那么$host是不是应该打印成www.xxx.com(这个我提问时没有说清楚:) )
在 2012-08-31 17:39:34,pengqi <fen...@gmail.com> 写道:
hi,
根据你的配置,
www.xxx.com是80端口的默认server,nginx中一个请求如果没有host头,或者host头的值没有匹配上任意的server_name,则这个请求会交给默认server处理。
另外一个请求刚来的时候,nginx在接收到该请求的host头之前,会根据端口及地址找到默认server,并使用它,直到nginx确切的知道该请求host头里面指定的值,再根据它重新寻找server来处理.
所以你这里状态码为408(请求超时),如果你确定都是使用
s.yyy.com来访问的,极有可能是nginx在接收到该请求的host头之前已经读超时了,所以打日志的时候,打印的host为
www.xxx.com (当然你的log_format 应该使用的是$host变量的话,$host变量取值为,当host头不为空,则打印host头的值,否则打印server_name)
--
Jinglong
Software Engineer
Server Platforms Team at Taobao