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
最經常使用的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的。要加速的業務數據應該存在獨立的域名,例如: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提供商爲網宿,藍訊,快網。
解耦是開發人員中流行的一個名詞,簡單地說就是把一堆程序代碼按照業務用途分開,而後提供服務,例如:註冊登陸,上傳,下載,瀏覽列表,商品內容頁面,訂單支付等都應該是獨立的程序服務,只不過在客戶端看來是一個總體而已。若是中小公司作不到上述細緻的解耦,起碼也要讓下面的幾個程序模塊獨立。
上述三者的功能儘可能分離。分離的最佳方式是分別使用獨立的服務器(須要改動程序),若是程序實在不易更改,次選方案是在前端負載均衡器Haproxy/Nginx上,根據URI(例如目錄或擴展名)過濾請求,而後拋給後面對應的服務器。
例如:根據擴展名分發,請求http://www.wk.com/a/b.jpg就應拋給圖片服務器(獨立的靜態服務器最適合使用CDN);根據URL路徑分發,請求http://www.wk.com/upload/index.php就應拋給上傳服務器。不符合上面兩個要求的,默認拋給Web服務器。
說明:能夠部署3臺服務器,人爲分佈請求服務器。固然了,這適合併發比較高,服務器較多的狀況。程序架構分離了,效率,安全性都會提升不少。
默認狀況下,Nginx的Master進程使用的是root用戶,worker進程使用的是Nginx指定的普通用過戶,使用root用戶跑Nginx的Master進程有兩個最大的問題:
配置普通用戶啓動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
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)錯誤
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 } }
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
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; } }