nginx根據http_user_agent防DDOS
前端squid反向代理到nginx
nginx根據http_user_agent防DDOS
首先查看訪問日志,找出可疑訪問 找到http_user_agent 的特征,然后再作過濾
"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate"
if ($http_user_agent ~ must-revalidate) {
return 503;
}
#這樣就返回503錯誤
location = / {
include proxy.conf;
if ( $http_user_agent ~* "MSIE 5.01" ) {
proxy_pass http://www.qq.com;
#access_log /usr/local/nginx/logs/k.log main;
}
proxy_pass http://windows.abc.com;
}
#判斷一下user-agent,如果是MSIE 5.01就把它丟到另外一個地方去就可以了,比如指向www.qq.com,看看能不能抗得住,哈哈
proxy_hide_header Cache-Control;
最后開回Cache-Control,訪問一下頁面
這下這個鏈接就緩存到前端squid了,應用服務器不會死機了
#########################################################
nginx中location模塊的詳細參數介紹
Nginx的Location可以有以下幾個匹配:
1. = 嚴格匹配這個查詢。如果找到,停止搜索。
2. ^~ 匹配路徑的前綴,如果找到,停止搜索。
3. ~ 為區分大小寫的正則匹配
4. ~* 為不區分大小寫匹配
5.!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配
文件及目錄匹配
* -f和!-f用來判斷是否存在文件
* -d和!-d用來判斷是否存在目錄
* -e和!-e用來判斷是否存在文件或目錄
* -x和!-x用來判斷文件是否可執行
一些可用的全局變量
nginx的全局變量參數解釋:
$arg_PARAMETER #這個變量包含GET請求中,如果有變量PARAMETER時的值。
$args #這個變量等於請求行中(GET請求)的參數,例如foo=123&bar=blahblah;
$binary_remote_addr #二進制的客戶地址。
$body_bytes_sent #響應時送出的body字節數數量。即使連接中斷,這個數據也是精確的。
$content_length #請求頭中的Content-length字段。
$content_type #請求頭中的Content-Type字段。
$cookie_COOKIE #cookie COOKIE變量的值
$document_root #當前請求在root指令中指定的值。
$document_uri #與$uri相同。
$host #請求主機頭字段,否則為服務器名稱。
$hostname #Set to the machine’s hostname as returned by gethostname
$http_HEADER
$is_args #如果有$args參數,這個變量等於”?”,否則等於”",空值。
$http_user_agent #客戶端agent信息
$http_cookie #客戶端cookie信息
$limit_rate #這個變量可以限制連接速率。
$query_string #與$args相同。
$request_body_file #客戶端請求主體信息的臨時文件名。
$request_method #客戶端請求的動作,通常為GET或POST。
$remote_addr #客戶端的IP地址。
$remote_port #客戶端的端口。
$remote_user #已經經過Auth Basic Module驗證的用戶名。
$request_completion #如果請求結束,設置為OK. 當請求未結束或如果該請求不是請求鏈串的最后一個時,為空(Empty)。
$request_method #GET或POST
$request_filename #當前請求的文件路徑,由root或alias指令與URI請求生成。
$request_uri #包含請求參數的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。不能修改。
$scheme #HTTP方法(如http,https)。
$server_protocol #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
$server_addr #服務器地址,在完成一次系統調用后可以確定這個值。
$server_name #服務器名稱。
$server_port #請求到達服務器的端口號。
$uri #不帶請求參數的當前URI,$uri不包含主機名,如”/foo/bar.html”。該值有可能和$request_uri 不一致。$request_uri是瀏覽器發過來的值。該值是rewrite后的值。例如做了internal redirects后。
rewrite后面的flag可以是:
last
break
redirect
permanent
proxy_pass http://localhost:80;
proxy_set_header Host $host;
可以自動改變轉發以后的域名信息
分類:
服務器運維