http code 400

1 篇文章 0 订阅
1 篇文章 0 订阅
最近服务器异常,nginx访问日志中出现大量的如下形式的请求:

x23.1x3.21x.xx - - [08/Jun/2012:04:46:39 +0800] "-" 400 0 "-" "-"
x23.1x3.21x.xx - - [08/Jun/2012:04:46:39 +0800] "-" 408 0 "-" "-"

每天这种请求大概占请求量的50%左右。

在php代码中,未定义400的异常,因此可以判定非php抛出。

网上查的出现这种日志主要有如下原因:

  1. 请求头过长,尤其是在cookie过多的情况下。
  2. chrome的preconnect技术,会生成大量的如上日志。
  3. no Host header sent

1. 请求头过长,那么可以修改nginx的请求头参数设置到一个合理的值。

参数: 

client_header_buffer_size 64k;
large_client_header_buffers 4 32k;

但是事实上一般不会出现这种错误,因为nginx资深设置的请求头一般够用。

除非你定义了大量的cookie。

2. chrome preconnect

如果是因为chrome的原因,有个很明显的特征:在每个400 0请求之前的请求user-agent='chrome'

而且这个是无解的。

3. no host header sent.

主要是指ip扫描工具,扫描当前机器ip,会生成一个请求,header中无host

如下脚本,就可以生成:

#!/bin/bash
exec 8<>/dev/tcp/openapi.360.cn/443
echo -ne "" >&8
cat <&8 

我们可以通过定义一个default_server来接受所有的ip请求。

server {
        listen 80 default_server;
        server_name _;
        access_log off;
        location / {
            deny all;
        }        
    } 

这样所有的ip请求被抛到default_server中,且关闭了日志。

这样这些烦人的"400 0"就不见了

说到这里,问题就基本解决了。但是还有一项事情要注意:

https服务器必须加入ssl_certificate, ssl_certificate_key两个参数

server {
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate      /usr/local/nginx/conf/ssl/edward.crt;
    ssl_certificate_key  /usr/local/nginx/conf/ssl/edward.key;
    access_log off;
    location / {
        deny all;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值