Nginx優化防爬蟲 限制http請求方法 CDN網頁加速 架構優化 監牢模式 控制併發量以及客戶端請求速率

Nginx防爬蟲優化

Robots協議(也稱爲爬蟲協議,機器人協議等)的全稱是「網絡爬蟲排除標準」(Robots Exclusion Protocol),網站經過Robots協議告訴搜索引擎哪些頁面能夠抓取,哪些頁面不能抓取。php

我理解的是robots.txt是經過代碼控制搜索引擎蜘蛛索引的一個手段,以便減輕網站服務器的帶寬使用率,從而讓網站的空間更穩定,同時也能夠提升網站其餘頁面的索引效率,提升網站收錄。html

咱們只須要建立一個robots.txt文本文件,而後在文檔內設置好代碼,告訴搜索引擎我網站的哪些文件你不能訪問。而後上傳到網站根目錄下面,由於當搜索引擎蜘蛛在索引一個網站時,會先爬行查看網站根目錄下是否有robots.txt文件。前端

京東的robots.txt設置以下: 
https://www.jd.com/robots.txtnode

淘寶的robots.txt設置以下: 
https://www.taobao.com/robots.txtnginx

360的robots.txt設置以下: 
http://www.360.cn/robots.txtweb

咱們能夠根據客戶端的user-agents信息,輕鬆地阻止指定的爬蟲爬取咱們的網站。瀏覽器

阻止下載協議代理,命令以下:緩存

##Block download agents##
if ($http_user_agent ~* LWP:Simple | BBBike | wget) 
{
    return 403;
}
#說明:若是用戶匹配了if後面的客戶端(例如wget),就返回403.

這裏根據$http_user_agent獲取客戶端agent,而後判斷是否容許或返回指定錯誤碼。安全

添加內容防止N多爬蟲代理訪問網站,命令以下:服務器

#這些爬蟲代理使用「|」分隔,具體要處理的爬蟲能夠根據需求增長或減小,添加的內容以下:
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot-Modile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! SSlurp  China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot")
{
    return 403;
}

測試禁止不一樣的瀏覽器軟件訪問

if ($http_user_agent ~* "Firefox|MSIE")
{
    rewrite ^(.*) http://www.wk.com/$1 permanent;
}
#若是瀏覽器爲Firefox或IE,就會跳轉到http://www.wk.com

利用Nginx限制HTTP的請求方法

最經常使用的HTTP方法爲GET,POST,咱們能夠經過Nginx限制HTTP請求的方法來達到提高服務器安全的目的,例如,讓HTTP只能使用GET,HEAD和POST方法的配置以下:

#Only allow these request methods
if ($request_method ! ~ ^(GET|HEAD|POST)$)
{
    return 501;
}

當上傳服務器上傳數據到存儲服務器時,用戶上傳寫入的目錄就不得不給Nginx對應的用戶相關權限,這樣一旦程序有漏洞,木馬就有可能被上傳到服務器掛載的對應存儲服務器的目錄裏,雖然咱們也作了禁止PHP,SH,PL,PY等擴展名的解析限制,但仍是會遺漏一些想不到的可執行文件。對於這樣狀況能夠經過限制上傳服務器的Web服務(能夠具體到文件)使用GET方法,防止用戶經過上傳服務器訪問存儲內容,讓訪問存儲渠道只能從靜態或圖片服務器入口進入。例如,在上傳服務器上限制HTTP的GET方法的配置以下:

#Only deny GET request methods ##
if ($request_method ~* ^(GET)$)
{
    return 501;
}
#提示:還能夠加一層location,更具體地限制文件名

使用CDN作網站內容加速

什麼是CDN

  • CDN的全稱是Content Delivery Network,中文意思是內容分發網絡。簡單地講,經過在現有的Internet中增長一層新的網絡架構,將網站的內容發佈到最接近用戶的Cache服務器內,經過智能DNS負載均衡技術,判斷用戶的來源,讓用戶就近使用與服務器相同線路的帶寬訪問Cache服務器,取得所需的內容。例如:天津網通用戶訪問天津網通Cache服務器上的內容,北京電信訪問北京電信Cache服務器上的內容。這樣能夠有效減小數據在網絡上傳輸的時間,提升訪問速度。
  • CDN是一套全國或全球的1分佈式緩存集羣,其實質是經過智能DNS判斷用戶的來源地域及上網線路,爲用戶選擇一個最接近用戶地域,以及和用戶上網線路相同的服務器節點,由於地域近,且線路相同,因此,能夠大幅提高用戶瀏覽網站的體驗。
  • CDN產生背景之一:BGP機房雖然能夠提高用戶體驗,可是價格昂貴,對於用戶來講,CDN的誕生能夠提供比BGP機房更好的體驗(讓同一地區,同一線路的用戶訪問和當地同一線路的網站),BGP機房和普通機房有將近5~10倍的價格差。CDN多使用單線的機房,根據用戶的線路及位置,爲用戶選擇靠近用戶的位置,以及相同的運營商線路,不但提高了用戶體驗,價格也降下來了。

CDN的價值: 

  • 爲架設網站的企業省錢
  • 提高企業網站的用戶訪問體驗(相同線路,相同地域,內存訪問)
  • 能夠阻擋大部分流量攻擊,例如:DDOS攻擊

CDN的特色

CDN就是一個具有根據用戶區域和線路智能調度的分佈式內存緩存集羣。其特色以下: 

  • 經過服務器內存緩存網站數據,提升了企業站點(尤爲含有大量圖片,視頻等的站點)的訪問速度,並大大提升企業站點的穩定性(省錢且提高用戶體驗)。
  • 用戶根據智能DNS技術自動選擇最適合的Cache服務器,下降了不一樣運營商之間互聯瓶頸形成的影響,實現了跨運營商的網絡加速,保證不一樣網絡中的用戶都能獲得良好的訪問質量。
  • 加快了訪問速度,減小了原站點的帶寬
  • 用戶訪問時從服務器的內存中讀取數據,分擔了網絡流量,同時減輕了原站點負載壓力等。
  • 使用CDN能夠分擔源站的網絡流量,同時能夠減輕原站點的負載壓力,並下降黑客入侵及各類DDOS攻擊對網站的影響,保證網站有較好的服務質量。

企業使用CDN的基本要求

首先要說的是,不是全部的網站均可以一上來就能用CDN的。要加速的業務數據應該存在獨立的域名,例如:img1-4.yunjisuan.com/video1-4.yunjisuan.com,業務內容圖片,附件,JS,CSS等靜態元素,這樣的靜態網站域名纔可使用CDN。

DNS解析範例。DNS服務器加速前的A記錄以下:

;A records
img.yunjisuanl.com IN A 124.106.0.21 (企業服務器的IP)
#刪除上面的記錄,命令以下:
img.yunjisuanl.com IN A 124.106.0.21 (服務器的IP)
#而後,作下面的別名解析:
;CNAME records
img.yunjisuan.com IN CNAME bbs
img.yunjisuan.com 3M IN CNAME img.yunjisuan.com.cachecn.com.

提示: 
這個img.yunjisuan.com.cachecn.com.地址必須是事先由CDN公司配置好的CDN公司的域名。國內較大的CDN提供商爲網宿,藍訊,快網。

Nginx程序架構優化

解耦是開發人員中流行的一個名詞,簡單地說就是把一堆程序代碼按照業務用途分開,而後提供服務,例如:註冊登陸,上傳,下載,瀏覽列表,商品內容頁面,訂單支付等都應該是獨立的程序服務,只不過在客戶端看來是一個總體而已。若是中小公司作不到上述細緻的解耦,起碼也要讓下面的幾個程序模塊獨立。

  • 網頁頁面服務。(靜態,動態頁面)
  • 圖片附件及下載服務。(upload)
  • 上傳圖片服務。(static)

上述三者的功能儘可能分離。分離的最佳方式是分別使用獨立的服務器(須要改動程序),若是程序實在不易更改,次選方案是在前端負載均衡器Haproxy/Nginx上,根據URI(例如目錄或擴展名)過濾請求,而後拋給後面對應的服務器。

例如:根據擴展名分發,請求http://www.wk.com/a/b.jpg就應拋給圖片服務器(獨立的靜態服務器最適合使用CDN);根據URL路徑分發,請求http://www.wk.com/upload/index.php就應拋給上傳服務器。不符合上面兩個要求的,默認拋給Web服務器。

說明:能夠部署3臺服務器,人爲分佈請求服務器。固然了,這適合併發比較高,服務器較多的狀況。程序架構分離了,效率,安全性都會提升不少。

使用普通用戶啓動Nginx(監牢模式)多實例nginx

爲何要讓Nginx服務使用普通用戶

默認狀況下,Nginx的Master進程使用的是root用戶,worker進程使用的是Nginx指定的普通用過戶,使用root用戶跑Nginx的Master進程有兩個最大的問題:

  • 管理權限必須是root,這就使得最小化分配權限原則遇到難題。
  • 使用root跑Nginx服務,一旦網站出現漏洞,用戶就能夠很容易地得到服務器的root權限。

給Nginx服務降權的解決方案

  • 給Nginx服務降權,用inca用戶跑Nginx服務,給開發及運維設置普通帳號,只要與inca同組便可管理Nginx,該方案解決了Nginx管理問題,防止root分配權限過大。
  • 開發人員使用普通帳戶便可管理Nginx服務及站點下的程序和日誌。
  • 採起項目負責制度,即誰負責項目維護,出了問題就是誰負責。

給Nginx服務降權實戰

配置普通用戶啓動Nginx的過程以下:

useradd wk
su - wk
mkdir conf logs www         #在普通用戶家目錄下建立nginx配置文件目錄 cp /usr/local/nginx/conf/mime.types ~/conf/
echo "hehe" > www/index.html

在普通用戶的家目錄裏的conf目錄裏建主配置 文件 主配文件的路徑所有找/home/wk

 特權用戶root使用的80端口,改成普通用過戶使用的端口,在1024以上,這cat conf/nginx.conf 

worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
error_log    /home/wk/logs/error.log;
user wk wk;
pid    /home/wk/logs/nginx.pid;
events {
    use    epoll;
    worker_connections    10240;
}
http {
    include     mime.types;
    default_type    application/octet-stream;
    sendfile    on;
    keepalive_timeout    65;
    log_format main '$remote_addr-$remote_user[$time_local]"$request"'
    '$status $body_bytes_sent "$http_referer"'
    '"$http_user_agent""$http_x_forwarded_for"';
    server {
        listen 8080;
        server_name www.wk.com;
        root    /home/wk/www;
        location / {
            index   index.php index.html index.htm;
        }
        access_log  /home/wk/logs/web_blog_access.log main;
    }
}
tree
├── conf
│   ├── mime.types
│   └── nginx.conf
├── logs
└── www
    └── index.html

啓動Nginx,命令以下:

/usr/local/nginx/sbin/nginx -c /home/wk/conf/nginx.conf &>/dev/null 

ps -ef | grep nginx | grep -v grep

 

 

控制Nginx併發鏈接數量

ngx_http_limit_conn_module這個模塊用於限制每一個定義的key值的鏈接數(Nginx默認已經被編譯),特別是單IP的鏈接數。

不是全部的鏈接數都會被計數。一個符合計數要求的鏈接是整個請求頭已經被讀取的鏈接。

 控制Nginx併發鏈接數量參數的說明以下:

 limit_conn_zone參數:

語法:limit_conn_zone key zone=name:size;
上下文:http
#用於設置共享內存區域,key能夠是字符串,Nginx自帶變量或前兩個組合,如$binary_remote_addr,$server_name.name爲內存區域的名稱,size爲內存區域的大小。

limit_conn參數:

語法:limit_conn zone number;
上下文:http,server,location
#用於指定key設置最大鏈接數。當超過最大鏈接數時,服務器會返回503(Service Temporarily Unavailable)錯誤

限制單IP併發鏈接數

Nginx的配置文件以下:

 

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    limit_conn_zone $binary_remote_addr zone=addr:10m;    #limit_conn_zone參數
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
            root   html;
            index  index.html index.htm;
            limit_conn addr 1;      #限制同IP的併發爲1;
        }
    }

 

以上功能的應用場景之一是用於服務器下載,命令以下:

location /download/ {
    limit_conn addr 11;
}
上面的命令限制訪問download下載目錄的鏈接數,該鏈接數1.

 限制虛擬主機總鏈接數

不只能夠限制單IP的併發鏈接數,還能夠限制虛擬主機總鏈接數,甚至能夠對二者同時限制。

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    limit_conn_zone $binary_remote_addr zone=addr:10m;      #設置參數下邊纔會生效
    limit_conn_zone $server_name zone=perserver:10m;        #設置參數下邊纔會生效
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
            root   html;
            index  index.html index.htm;
        #limit_conn addr 1;
        limit_conn perserver 2;     #設置虛擬主機鏈接數爲2
        }
    }

 

控制客戶端請求Nginx的速率

ngx_http_limit_req_module模塊用於限制每一個IP訪問每一個定義key的請求速率。

語法:limit\_req\_zone key zone=name: size rate=rate;
上下文1:http
#用於設置共享內存區域,key能夠是1字符串,Nginx自帶變量或前兩個組合,如$binary_remote_addr。name爲內存區域的名稱,size爲內存區域的大小,rate爲速率,單位爲r/s,每秒一個請求。
limit_req參數說明以下:
語法:limit_req zone=name [burst=number][nodelay];
上下文:http,server,location
  • 這裏運用了令牌桶原理,burst=num,一共有num塊令牌,令牌發完後,多出來的那些請求就會返回503。
  • 換句話說,一個銀行,只有一個營業員,銀行很小,等候室只有5我的的位置。所以,營業員一個時刻只能爲一我的提供服務,剩下的不超過5我的能夠在銀行內等待,超出的人不提供服務,直接返回503。
  • nodelay默認在不超過burst值的前提下會排隊等待處理,若是使用此參數,就會處理完num + 1次請求,剩餘的請求都視爲超時,返回503。

 Nginx配置文件以下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;    #以請求的客戶端IP做爲key值,內存區域命令爲one,分配10m內存空間,訪問速率限制爲1秒1次請求(request)
#    limit_conn_zone $binary_remote_addr zone=addr:10m;
#    limit_conn_zone $server_name zone=perserver:10m;
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
            root   html;
            index  index.html index.htm;
            limit_req zone=one burst=5;     #使用前面定義的名爲one的內存空間,隊列值爲5,便可以有5個請求排隊等待
#           limit_conn addr 1;
#           limit_conn addr 1;
        }
    }
相關文章
相關標籤/搜索