http code 400

來源:互聯網
上載者:User

最近伺服器異常,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/bashexec 8<>/dev/tcp/openapi.360.cn/443echo -ne "" >&8cat <&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;    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.