nginx 400 bad request errors

有人问我为什么nginx的access日志文件突然间变大M,查看结果nginx默认主机日志记录出现如下的400错误。

 

重现办法:

telnet localhost 80
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 400 Bad Request
Server: nginx/1.2.5
Date: Wed, 26 Dec 2012 03:37:08 GMT
Content-Type: text/html
Content-Length: 172
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.2.5</center>
</body>
</html>
Connection closed by foreign host.

日志里会记录一条

127.0.0.1 - - [26/Dec/2012:03:37:08 +0000] "GET / HTTP/1.1" 400 172 "-" "-"

分析:

http1.1的标准规定请求必须包含头部信息,如果请求头为空那么web server直接返回400,详细可以看RFC文档RFC 2316, section 14.23

除了上面这种telnet方式可能造成空请求头外,当浏览器下载图片的同时点击别的链接,会关闭下载连接,也会出现空请求头,再或者机器人构造的空请求头访问。

去掉access日志中的400方法

0.7.12以前版本的nginx收到一个空请求,nginx不会去与任何虚拟主机匹配,直接返回400错误,

之后的新版本nginx可以用server_name _;匹配空请求头。

所以如果用的旧版本先升级到0.7.12以后的版本

升级之后添加如下默认虚拟主机server。

增加默认的server到配置文件,以下配置的解释看这里禁止未绑定域名访问

server {
  listen 80 default_server;
  server_name _;
  return 404;
  access_log off;
}

建议把上面这个server保存为default.conf,然后include到主配置文件nginx.conf。

源自:http://www.nginx.cn/607.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值