[Nginx] – 安全優化 – 配置文件優化

1.配置Nginx gzip壓縮實現性能優化

1.Nginx gzip壓縮功能介紹 
  Nginx gzip壓縮模塊提供了壓縮文件內容的功能,用戶請求的內容在發送出用客戶端以前,Nginx服務器會根據一些具體的策略實施壓縮,以節約網站出口帶寬,同時加快了數據傳輸效率,提高了用戶訪問體驗。 
2.Nginx gzip 壓縮的優勢 
 1.提高網站用戶體驗:因爲發給用戶的內容小了,因此用戶訪問單位大小的頁面就快了,用戶體驗提高了,網站口碑就行了。 
 2.節約網站帶寬成本,因爲數據是壓縮傳輸的,所以,此舉節省了網站的帶寬流量成本,不過壓縮會稍微消耗一些CPU資源,這個通常能夠忽略。此功能既能讓用戶體驗加強,公司也少花錢。對於幾乎全部的Web服務來講,這是一個很是重要的功能,Apache服務也由此功能。 
 3.須要和不須要壓縮的對象javascript

一、純文本內容壓縮比很高,所以純文本內容是最好壓縮,例如:html、js、css、xml、shtml等格式的文件 
二、被壓縮的純文本文件必需要大於1KB,因爲壓縮算法的特殊緣由,極小的文件壓縮可能反而變大。 
三、圖片、視頻(流媒體)等文件儘可能不要壓縮,由於這些文件大多數都是經歷壓縮的,若是再壓縮很坑不會減少或減小不多,或者可能增長。而在壓縮時還會消耗大量的CPU、內存資源 
四、參數介紹及配置說明 
  此壓縮功能很相似早起的Apache服務的mod_defalate壓縮功能,Nginx的gzip壓縮功能依賴於ngx_http_gzip_module模塊,默認已安裝。 
參數說明以下:php

 
gzip on; #開啓gzip壓縮功能 gzip_min_length 1k; #設置容許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取,默認值是0,表示無論頁面多大都進行壓縮,建議設置成大於1K,若是小於1K可能會越壓越大 gzip_buffers 4 16k; #壓縮緩衝區大小,表示申請4個單位爲16K的內存做爲壓縮結果流緩存,默認是申請與原始是數據大小相同的內存空間來存儲gzip壓縮結果; gzip_http_version 1.1 #壓縮版本(默認1.1 前端爲squid2.5時使用1.0)用於設置識別HTTP協議版本,默認是1.1,目前大部分瀏覽器已經支持GZIP壓縮,使用默認便可。 gzip_comp_level 2; #壓縮比率,用來指定GZIP壓縮比,1壓縮比最小,處理速度最快;9壓縮比最大,傳輸速度快,但處理最慢,也消耗CPU資源 gzip_types text/css text/xml application/javascript; #用來指定壓縮的類型,「text/html」類型老是會被壓縮,這個就是HTTP原理部分講的媒體類型。 gzip_vary on; #vary hear支持,該選項可讓前端的緩存服務器緩存通過GZIP壓縮的頁面,例如用緩存通過Nginx壓縮的數據。

配置在http標籤端css

http{ gzip on; gzip_min_length 1k; gzip_buffers 4 32k; gzip_http_version 1.1; gzip_comp_level 9; gzip_types text/css text/xml application/javascript; gzip_vary on; }

設置完成以後重啓Nginx服務器。 
並在360 火狐| 谷歌 等瀏覽器中安裝插件FirebugYSlow 進行查看頁面壓縮率html

例如:沒有製做壓縮圖片 
image_1b4t16l2e1hf22ir12sb1ukisd9.png-178.6kB
製做後 
image_1b4t19ftsuh97c5bm2arrndmm.png-181kB前端

2.配置Nginx expires緩存實現性能優化

1.Nginx expires 功能介紹 
  簡單地說,Nginx expires的功能就是爲用戶訪問的網站內容設定一個國企時間,當用戶第一次訪問到這些內容時,會把這樣內容存儲在用戶瀏覽器本地,這樣用戶第二次及此後繼續訪問網站,瀏覽器會檢查加載緩存在用戶瀏覽器本地的內容,就不會去服務器下載了。直到緩存的內容過時或被清除爲止。 
  深刻理解,expires的功能就是容許經過Nginx 配置文件控制HTTP的「Expires」和「Cache-Contorl」響應頭部內容,告訴客戶端劉琦是否緩存和緩存多久之內訪問的內容。這個expires模塊控制Nginx 服務器應答時Expires頭內容和Cache-Control頭的max-age指定。 
  這些HTTP頭向客戶端表名了內容的有效性和持久性。若是客戶端本地有內容緩存,則內容就能夠從緩存(除非已通過期)而不是從服務器讀取,而後客戶端會檢查緩存中的副本。java

2.Nginx expires做用介紹 
  在網站的開發和運營中,對於圖片 視頻 css js等網站元素的更改機會較少,特別是圖片,這時能夠將圖片設置在客戶端瀏覽器本地緩存365天或3650天,而降css、js、html等代碼緩存10~30天,這樣用戶第一次打開頁面後,會在本地的瀏覽器按照過時日期緩存響應的內容,下次用戶再打開相似頁面,重複的元素就無需下載了,從而加快了用戶訪問速度,因爲用戶的訪問請求和數據減小了,所以節省了服務器端大量的帶寬。此功能和apacheexpire類似。ios

3.Nginx expires 功能優勢 
1.Expires能夠下降網站的帶寬,節約成本。 
2.加快用戶訪問網站的速度,提高了用戶訪問體驗。 
3.服務器訪問量下降了,服務器壓力就減輕了,服務器成本也會下降,甚至能夠解決人力成本。 
對於幾乎全部Web來講,這是很是重要的功能之一,Apache服務也由此功能。nginx

4. Nginx expires 配置詳解 
1)根據文件擴展名進行判斷,添加expires功能範例。web

location ~.*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 3650d; }

該範例的意思是當前用戶訪問網站URL結尾的文件擴展名爲上述指定的各類類型的圖片時,設置緩存3650天,即10年。 
提示:配置能夠放在server標籤,也能夠放在http標籤下配置 
image_1b4t1es7v3m31jk47pl7sn1pbn13.png-70.4kB
例如:算法

[root@web02 /]# curl -I www.jd.com HTTP/1.1 200 OK Server: jdws Date: Mon, 25 Jul 2016 15:15:47 GMT Content-Type: text/html; charset=gbk Content-Length: 197220 Connection: keep-alive Vary: Accept-Encoding Expires: Mon, 25 Jul 2016 15:15:38 GMT #告訴用戶何時過時 Cache-Control: max-age=20 ser: 6.158 Via: BJ-M-YZ-NX-74(HIT), http/1.1 BJ-UNI-1-JCS-117 ( [cRs f ]) Age: 16

 

2)根據URI中的路徑(目錄)進行判斷,添加expires功能範例。

location ~^/(images|javascript|js|css|flash|media|static)/ { expires 360d; }

意思是當用戶訪問URI中包含上述路徑(例:images js css 這些在服務端是程序目錄)時,把訪問的內容設置緩存360天,即1年。若是要想緩存30天,設置30d便可。

HTTP/1.1 200 OK Server: JDWS Date: Mon, 25 Jul 2016 16:00:32 GMT Content-Type: text/html; charset=gbk Vary: Accept-Encoding Expires: Mon, 25 Jul 2016 16:00:48 GMT #<==緩存的過時時間 Cache-Control: max-age=20 #<==緩存的總時間按秒,單位 ser: 130.29 Via: BJ-Y-NX-104(HIT), http/1.1 HK-1-JCS-70 ( [cRs f ]) Age: 14 Content-Length: 197220

5.Nginx expires功能缺點及解決方法 
  當網站被緩存的頁面或數據更新了,此時用戶看到的可能仍是舊的已經緩存的內容,這樣會影響用戶體驗。 
  對常常須要變更的圖片等文件,能夠縮短對象緩存時間,例如:谷歌和百度的首頁圖片常常根據不一樣的日期換成一些節日的圖,因此這裏能夠將圖片設置爲緩存期爲1天。 
  當網站改版或更新內容時,能夠在服務器將緩存的對象更名(網站代碼程序)。

1.對於網站的圖片、軟件,通常不會被用戶直接修改,用戶層面上的修改圖片,其實是從新傳到服務器,雖然內容同樣可是是一個新的圖片名了 
2.網站改版升級會修改JS、CSS元素,若改版的時候對這些元素該了名,會使得前端的CDN以及用戶須要從新緩存內容。

6.企業網站緩存日期曾經的案例參考 
  若企業的業務和訪問量不一樣,那麼網站的緩存期時間設置也是不一樣的,好比: 
a.51CTP:1周 
b.sina:15天 
c.京東:25年 
d.淘寶:10年

7.企業網站有可能不但願被緩存的內容 
1.廣告圖片,用於廣告服務,都緩存了就很差控制展現了。 
2.網站流量統計工具(js代碼)都緩存了流量統計就不許了 
3.更新很頻繁的文件(google的logo),若是按天,緩存效果仍是顯著的。

3.Nginx日誌相關優化與安裝

1.編寫腳本腳本實現Nginx access日誌輪詢 
  Nginx目前沒有相似Apache的經過cronlog或者rotatelog對日誌分割處理的能力,可是,運維人員能夠經過利用腳本開發、Nginx的信號控制功能或reload從新加載,來實現日誌自動切割,輪詢。

(1)配置日誌切割腳本

[root@web02 /]# mkdir /server/scripts/ -p [root@web02 /]# cd /server/scripts/ [root@web02 scripts]# cat cut_nginx_log.sh cd /application/nginx/logs && \ /bin/mv www_access.log www_access_$(data +%F -d -1dy).log #將日誌按日誌改爲前一天的名稱 /application/nginx/sbin/nginx -s reload #從新加載nginx使得從新生成訪問日誌文件

提示:實際上腳本的功能很簡單,就是更名日誌,而後加載nginx,從新生成文件記錄日誌。

 

(2)將這段腳本保存後加入到定時任務,設置天天凌晨0點進行切割日誌

[root@web02 scripts]# crontab -e ###cut nginx access log 00 00 * * * /bin/sh /server/scripts/cut_nginx.log.sh >/dev/null 2>&1

解釋:天天0點執行cut_nginx_log.sh腳本,將腳本的輸出重定向到空。

2.不記錄不須要的訪問日誌 
  對於負載均衡器健康檢查節點或某些特定文件(好比圖片、jscss)的日誌,通常不須要記錄下來,由於在統計PV時是按照頁面計算的。並且日誌寫入頻繁會大量消耗磁盤I/O,下降服務的性能。 
具體配置以下:

location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)?$ { access_log off; }

這裏用location標籤匹配不記錄日誌的元素擴展名,而後關掉了日誌。

3.訪問日誌的權限設置 
加入日誌目錄爲/app/logs 則受權方法爲:

chown -R root.root /app/logs/ chmod -R 700 /app/logs

不須要在日誌目錄上給nginx用戶讀或寫的許可。

4.Nginx站點目錄及文件URL訪問控制

1.根據擴展名限制程序和文件訪問 
  Web2.0時代,絕大多數網站都是以用戶爲中心,例如:BBS、blog、sns產品,這幾個產品共同特色就是不但容許用戶發佈內容到服務器,還容許用戶發圖片甚至附件到服務器,因爲爲用戶打開了上傳的功能,由於給服務器帶來了很大的安全風險。 
  下面將利用Nginx配置禁止訪問上傳資源目錄下的PHP、shell、perl、Python程序文件,這樣用戶即便上傳了木馬文件也無法去執行,從而增強了網站的安全。 
配置Nginx,限制禁止解析指定目錄下的制定程序。

location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$ { deny all; } location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$ { deny all; } location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ { deny all; }

Nginx下配置禁止訪問*.txt文件

location ~*\.(txt|doc)${ if (-f $request_filename) { root /data/www/www; #rewrite ....能夠重定向某個URL break; } } location ~*\.(txt|doc)${ root /data/www/www; deny all; }

對上述限制須要卸載php匹配的前面

 
  location ~.*\.(php|php5)?$ {  fastcgi_pass 127.0.0.1:9000  fastcgi_index index.php  include fcgi.conf; }

對目錄訪問進行設置

單目錄

location ~ ^/(static)/ { deny all; } location ~ ^/static { deny all; }

多目錄

location ~ ^/(static)/ { deny all; }

範例:禁止訪問目錄並返回指定的http狀態碼

location /admin/ { return 404; } location /templates/ { return 403; }

限制網站來源IP訪問 
案例環境:phpmyadmin 數據庫的Web客戶端,內部開發人員使用 
禁止某目錄讓外界訪問,但容許某IP訪問該目錄,切支持PHP解析

location ~ ^/docker/ { allow 202.111.12.211; deny all; }

企業問題案例: Nginx作反向代理的時候能夠限制客戶端IP嗎? 
解答:能夠,具體方法以下。

方法1:使用if來控制。 if ( $remote_addr = 10.0.0.7 ) { return 403; } if ( $remote_addr = 218.247.17.130 ) { set $allow_access_root 'true'; }

5.配置Nginx禁止非法域名解析訪問企業網站

Nginx如何預防用戶IP訪問網站(惡意域名解析,至關因而直接IP訪問企業網站) 

一:第一種方法
讓使用IP訪問的網站用戶,或者而已解析域名的用戶,收到501錯誤

在配置文件中添加一個server主機,輸入下面內容:

server { listen 80 default_server; server_name _; return 501; }

 

二:第二種方法

經過301跳轉到主頁。

server { listen 80 default_server; server_name _; rewrite ^(.*) http://www.abcdocker.com/$1 permanent;
}

要放在第一個server

if ($host !~ ^www/.abcdocker/.com$){ rewrite ^(.*) http://www.abcdocker.com$1 permanent;
}

若是header信息和host主機名字字段非www.abcdocker.com,就301跳轉到www.baidu.cn

6.Nginx圖片及目錄防盜鏈解決方案

1.什麼是資源盜鏈 
  簡單的說,就是某些不發的網站未經許可,經過在其自身網站程序裏非法調用其餘網站的資源嗎,而後在本身的網站上顯示。達到補充自身網站的效果,這一舉動不但浪費了調用網站的流量,還形成服務器的壓力,甚至宕機。 
image_1b4t2o155shp1gh61ru01ef81mgj1g.png-120.7kB
2.網站資源被盜鏈帶來的問題 
  若網站圖片及相關資源被盜鏈,最直接的影響就是網絡帶寬佔用加大了,帶寬費用多了,網站流量也可能忽高忽低,nagios/zabbix等報警服務頻繁報警。 
image_1b4t2oua01igeck1c85v0bn1m1t.png-78.9kB
  最嚴重的狀況就是網站的資源被非法使用,致使網站帶寬成本加大和服務器壓力加大,有可能會致使數萬元的損失,且網站的正經常使用戶訪問也會受到影響。 
3.網站資源被盜鏈嚴重問題企業真實案例 
公司的CDN源站的流量沒有變更,可是CDN加速那邊的流量無端超了好幾個GB,不知道怎麼如理。 
該故障的影響: 
因爲是購買的CDN網站加速服務,所以雖然流量多了幾個GB,可是業務未受影響。只是,這麼大的異常流量,持續下去可直接致使公司無端損失數萬元。 
解決方案: 
第一,對IDC及CDN帶寬作監控報警。 
第二,做爲高級運維或者運維經理,天天上班的重要任務,就是常常查看網站流量圖,關注流量變化,關注異常流量 
第三,對訪問日誌作分析,對於異常流量迅速定位,而且和公司市場推廣等有比較好的默契溝通 
相關博客:輕鬆應對IDC機房帶寬忽然暴漲問題

4.常見防盜鏈解決方案的基本原理 
(1)根據http referer 實現防盜鏈 
  在HTTP協議中,有一個表頭字段叫referer,使用URL格式來表示哪裏的連接用了當前網頁的資源。經過referer能夠檢測目標訪問的來源網頁,若是是資源文件,能夠跟蹤到顯示它的網頁地址,一旦檢測出來不是本站,立刻進行阻止或返回指定的頁面。 
  HTTP Referer是header的一部分,當瀏覽器向Web服務器發送請求的時候,通常會帶上Referer,告訴服務器我是從哪一個頁面連接過來的,服務器籍此能夠得到一些信息用於處理,Apache、Nginx、Lighttpd三者都支持根據http referer實現防盜鏈referer是目前網站圖片、附件、html最經常使用的盜鏈手段。

 
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; #--> $http_referer

 

image_1b4t2spm61ti81s9j80p1ooq1eg02a.png-111.9kB

(2)根據cookie防盜鏈 
  對於一些特殊的業務數據,例如流媒體應用以及經過Active X顯示的內容(例如,Flash、Windows Media視頻、流媒體的RTSP協議等)由於他們不向服務器提供Referer Header,因此若也採用上述的Referer的防盜鏈手段就達不到想要的結果。 
  對於視頻這種佔用流量較大的業務根據實現防盜鏈是比較困難的,此時能夠採用Cookie技術,來解決對Flash、Windows Media視頻等防盜鏈問題。 
  例如:Active X插件不傳遞Referer,但會傳遞Cookie。能夠在顯示Active X的頁面的 標籤內嵌入一段代碼,能夠用JavaScript 代碼來設置一段Cookie;Cache=av; 
image_1b4t2u09vq119ai14f111av1dr22n.png-20.8kB
而後就能夠經過各類手段來判斷這個Cookie的存在以及驗證其值的操做了。

(3)經過加密變換訪問路徑實現防盜鏈 
  此方法比較適合視頻以及下載類業務的網站。例如:Lighttpd 有相似的插件mod_secdownload來實現此功能,如今服務器配置此模塊,設置一個固定用於加密的字符串,好比abcdocker,而後設置一個url前綴,好比/abc/,再設置一個過時時間,好比1小時,而後寫一段PHP代碼,例如加密字符串和系統時間等經過md5算法生產一個加密字符串,最終獲取到的文件的URL鏈接種會帶由一個時間戳和一個加密字符的md5數值,在訪問時系統會對這兩個數據進行驗證。若是時間不在預期的時間段內(如1小時)則失效;若是時間戳符合條件,可是加密的字符串不符合條件也失效,從而達到防盜鏈的效果。

PHP代碼示例以下: 
image_1b4t2v8j117ev4vh18nsf1h1dij34.png-60.3kB
Nginx實現下載防盜鏈模塊 
http://nginx.org/en/docs/http/ngx_http_secure_link_module.html 
(4)在產品設計上解決盜鏈方案 
  產品設計時,處理盜鏈問題可將計就計,爲網絡上傳的圖片添加水印。 

 

  圖片添加版權水印,不少網站通常直接轉載圖片是爲了快捷,可是對於有水印的圖片,不少站長是不肯意進行轉載的。 
   
(4)Nginx防盜鏈演示 
1.利用referer而且針對擴展名rewrite重定向。

#Preventing hot linking of images and other file types location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked *.abcdocker.org abcdocker.org; if ($invalid_referer) { rewrite ^/ http://bbs.abcdocker.org/img/nolink.gif;
} root html/www; }

提示:要根據主機公司實際業務(是否有外聯的合做),進行域名設置。 
針對防盜鏈中設置進行解釋 
jpg png swf flv rar zip 表示對jpg、gif等zip爲後綴的文件實行防盜鏈處理 
*.abcdocker.org abcdocker.org表示這個請求能夠正常訪問上面指定的文件資源 
if{}中內容的意思是:若是地址不是上面指定的地址就跳轉到經過rewrite指定的地址,也能夠直接經過retum返回403錯誤 
return 403爲定義的http返回狀態碼 
rewrite ^/ http://bbs.abcdocker.org/img/nolink.gif;表示顯示一張防盜鏈圖片 
access_log off;表示不記錄訪問日誌,減輕壓力 
expires 3d指的是全部文件3天的瀏覽器緩存

實戰模擬演示 
1)假定blog.abcdocker.com是非法盜鏈的網站域名,先寫一個html程序。

 
<html>
<head>
<title>
123456789
</title>
</head>
<body bgcolor=green> 博客<br>個人博客<a href="http://oldboy.blog.etiantian.org" target=_blank「>博客地址</a>
<img src="http://www.abcdocker.com/stu.jpg">
</body>
</html>

 

這個非法連接的網站給他用戶提供的訪問地址是 
http://blog.abcdocker.com/123.html 網站裏回家再www.abcdocker.com網站圖片的stu.jpg 
Nginx的日誌格式爲www.abcdocker.com,其內容以下

 
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

 

盜鏈的圖片blog.abcdocker.com訪問咱們站點時,記錄的日誌以下:

 
10.0.0.1 - - [30/May/2016:11:13:38 +0800] "GET /stu.jpg HTTP/1.1" 200 68080 "http://blog.abcdocker.com/123.html "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"

 

可在www.abcdocker.com網站下設置防盜鏈,Nginx的方法以下:

 
#Preventing hot linking of images and other file types location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked *.abcdocker.org abcdocker.org; if ($invalid_referer) { rewrite ^/ http://bbs.abcdocker.org/img/nolink.gif;
} root html/www; }

 

提示: referers不是*.abcdocker.org的話,就給他一個跳轉

5.爲何要配置錯誤頁面優化顯示? 
  在網站的運行過程當中,可能因爲頁面不存在或者系統過載等緣由,致使網站沒法正常響應用於的請求,此時Web服務默認會返回系統默認的錯誤碼,或者很不友好的頁面。影響用戶體驗 
image_1b4t36ph5k9t68f1t6b1vkb1qrv3u.png-26.6kB
對錯誤代碼404實行本地頁面優雅顯示

 
server { listen 80; server_name www.etiantian.org; location / { root html/www; index index.php index.html index.htm; error_page 404 /404.html #當頁面出現404錯誤時,會跳轉404.html頁面顯示給用戶 }

 

提示: 
此路徑相對於root html/www;

 
error_page 404 /404.html; error_page 403 /403.html;

 

另外一種 重定向到一個地址

 
error_page 404 http://www.abcdocker.com;
#error_page 404 /404.html; error_page 404 http://www.abcdocker.com;

 

能夠寫多行。

 
error_page 404 /404.html; error_page 500 502 503 504 /50x.html;

 

阿里門戶網站天貓的Nginx優雅顯示配置案例以下:

 
error_page 500 501 502 503 504 http://err.tmall.com/error2.html;
error_page 400 403 404 405 408 410 411 412 413 414 415 http://err.tmall.com/error1.html;

 

 

7.Nginx站點目錄文件及目錄權限優化

  爲了保證網站不遭受木馬入侵,全部站點的用戶和組都應該爲root,全部目錄權限是755;全部文件權限是644.設置以下:

 
  1. -rw-r--r-- 1 root root 20 May 26 12:04 test_info.php
  2. drw-r--r-- 8 root root 4096 May 29 16:41 uploads

image_1b4t3apvf1187ap817u81ahs1b4b.png-143.7kB

  能夠設置上傳只能夠put不能夠get,或者使用location不容許訪問共享服務器的內容,圖片服務器禁止訪問php|py|sh。這樣就算黑客將php木立刻傳上來也沒法進行執行

集羣架構中不一樣角色的權限具體思路說明 
image_1b4t3dafg1bb5186315bt1n2t13c44o.png-57.6kB

 

8.Nginx防爬蟲優化

1.robots.txt機器人協議介紹 
  Robots協議(也成爲爬蟲協議、機器人協議等)的全稱是網絡爬蟲排除標準(Robots Exclusin Protocol)網站經過Robots協議告訴引擎那個頁面能夠抓取,那些頁面不能抓取。

2.機器人協議八卦 
image_1b4t3f0ct13b32ml33c1ob31rfk55.png-50.4kB
2008年9月8日,淘寶網宣佈封殺百度爬蟲,百度熱痛遵照爬蟲協議,由於一旦破壞協議,用戶的隱私和利益就沒法獲得保障。 
image_1b4t3flbb53fhu81kvtm3keko5i.png-44.1kB
2012年8月。360綜合搜索被指違反robots協議 
image_1b4t3fv0rov91ilj9j616sotf05v.png-84.6kB

3.Nginx防爬蟲優化 
  咱們能夠根據客戶端的user-agents信息,輕鬆地阻止爬蟲取咱們的網站防爬蟲 
範例:阻止下載協議代理

 
## Block download agents ## if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; }

 

說明:若是用戶匹配了if後面的客戶端(例如wget)就返回403

範例:添加內容防止N多爬蟲代理訪問網站

 
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot") { return 403; }

 

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

 
if ($http_user_agent ~* "Firefox|MSIE") { rewrite ^(.*) http://blog.etiantian.org/$1 permanent;
} 若是瀏覽器爲Firefox或者IE就會跳轉到http:blog.etiantian.org

 

提示: 
這裏主要用了$remote_addr這個函數在記錄。 
查看更多函數

 
[root@web02 conf]# cat fastcgi_params fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;

 

 

9.利用Nginx限制HTTP的請求方法

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

 
#Only allow these request methods if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; } #Do not accept DELETE, SEARCH and other methods

 

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

 
## Only allow GET request methods ## if ($request_method ~* ^(GET)$ ) { return 501; }

 

提示:還能夠加一層location更具體的限制文件名 
image_1b4t3q9omg2k1o4hv3e1i8b1jb36c.png-51.5kB

 

10.使用CDN作網站內容加速

1.什麼是CDN? 
  CDN的全稱是Content Delivery Network 中文意思是內容分發網絡。 
  經過現有的Internet中增長一層新的網絡架構,將網站的內容發佈到最接近用戶的cache服務器內,經過智能DNS負載均衡技術,判斷用戶的來源,讓用戶就近使用和服務器相同線路的帶寬訪問cache服務器取得所需的內容。 
  例如:天津網通用戶訪問天津網通Cache服務器上的內容,北京電信訪問北京電信Cache服務器上的內容。這樣能夠減小數據在網絡上傳輸的事件,提升訪問速度。 
  CDN是一套全國或全球的分佈式緩存集羣,其實質是經過智能DNS判斷用戶的來源地域以及上網線路,爲用戶選擇一個最接近用戶地域以及和用戶上網線路相同的服務器節點,由於地域近,且線路相同,因此,能夠大幅度提高瀏覽網站的體驗。

CDN的價值 
一、爲架設網站的企業省錢。 
二、提高企業網站的用戶訪問體驗(相同線路,相同地域,內存訪問)。 
三、能夠阻擋大部分流量攻擊,例如:DDOS攻擊 
更多CDN介紹請查看本網相關文章

 

11.Nginx程序架構優化

1.爲網站程序解耦 
  解耦是開發人員中流行的一個名詞,簡單地說就是把一堆程序代碼按照業務用途分開,而後提供服務,例如:註冊登陸、上傳、下載、訂單支付等都應該是獨立的程序服務,只不過在客戶端看來是一個總體而已。若是中小公司作不到上述細緻的解耦,最起碼讓下面的幾個程序模塊獨立。 
1.網站頁面服務 
2.圖片附件及下載服務。 
3.上傳圖片服務 
  上述三者的功能儘可能分離。分離的最佳方式是分別使用獨立的服務器(須要改動程序)若是程序實在很差改,次選方案是在前端負載均衡器haproxy/nginx上,根據URI設置

使用普通用戶啓動Nginx(監牢模式)

1.爲何要讓Nginx服務使用普通用戶 
  默認狀況下,Nginx的Master進程使用的是root用戶,Worker進程使用的是Nginx指定的普通用戶,使用root用戶跑Nginx的Master進程由兩個最大的問題: 
▲ 管理權限必須是root,這就使得最小化分配權限原則遇到難題 
▲使用root跑Nginx服務,一旦網站出現漏洞,用戶就很容易得到服務器root權限

 
[root@web02 ~]# ps -ef|grep nginx root 2155 1 0 03:43 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx www 2156 2155 0 03:43 ? 00:00:01 nginx: worker process www 3047 2155 0 06:17 ? 00:00:00 nginx: worker process www 3051 2155 0 06:17 ? 00:00:00 nginx: worker process www 3435 2155 0 11:13 ? 00:00:00 nginx: worker process

 

2.給Nginx服務降權解決方案

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

3.實時Nginx降權方案

[root@web02 ~]# useradd inca [root@web02 ~]# su - inca [inca@web02 ~]$ pwd /home/inca [inca@web02 ~]$ mkdir conf logs www [inca@web02 ~]$ cp /application/nginx/conf/mime.types ~/conf/ [inca@web02 ~]$ echo inca >www/index.html [inca@web01 ~]$ cat conf/nginx.conf worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; worker_rlimit_nofile 65535; error_log /home/inca/logs/error.log; user inca inca; pid /home/inca/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"'; #web.fei fa daolian.............. server { listen 8080; server_name www.etiantian.org; root /home/inca/www; location / { index index.php index.html index.htm; } access_log /home/inca/logs/web_blog_access.log main; } }

 

提示,須要關閉root權限的nginx,不然會報錯

 
[root@web02 ~]# /application/nginx/sbin/nginx -s stop [root@web02 ~]# lsof -i:80

 

切換用戶,啓動Nginx

 
[root@web02 ~]# su - inca [inca@web02 ~]$ /application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf &>/dev/null & [1] 3926 [inca@web02 ~]$ lsof -i:80 [1]+ Exit 1 /application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf &>/dev/null

 

本解決方案的優勢以下: 
1.給Nginx服務降權,讓網站更安全 
2.按用戶設置站點權限,使站點更安全(無需虛擬化隔離) 
3.開發不須要用root便可完整管理服務及站點 
4.可實現對責任劃分,網絡問題屬於運維的責任,打開不就是開發責任或共同承擔

控制Nginx併發鏈接數 
  nginx_http_limit_conn_module這個模塊用於限制每一個定義的key值的鏈接數,特別是單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

 

配置文件以下:

 
[root@oldboy ~]# cat /application/nginx/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; limit_conn_zone $binary_remote_addr zone=addr:10m; server { listen 80; server_name www.etiantian.org; location / { root html; index index.html index.htm; limit_conn addr 1; #<==限制單IP的併發鏈接爲1 } } }

 

還能夠設置某個目錄單IP併發鏈接數

 
location /download/ { limit_conn addr 1; }

 

在客戶端使用Apache的ab測試工具進行測試 
執行ab -c 1 -n 10 http://10.0.0.3進行測試 
注意:-c併發數、-n請求總數,10.0.0.3nginx的IP地址

image_1b4t44gou1vvj1t4tjv01lcb8116p.png-163.5kB

 

12.控制客戶端請求Nginx的速率

  ngx_http_limit_req_module模塊用於限制每一個IP訪問定義key的請求速率。 
limit_req_zone參數說明以下: 
語法:limit_req_zonekey zone=name:size rate=rate; 
用於設置共享內存區域,key能夠是字符串、Nginx自有變量或前兩個組合,如$binary_remote_addr name爲內存區域的名稱,size爲內存區域的大小,rate爲速率,單位爲r/s 每秒一個請求。

 
[root@oldboy ~]# cat /application/nginx/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } 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) server { listen 80; server_name www.etiantian.org; location / { root html; index index.html index.htm; limit_req zone=one burst=5; #<==使用前面定義的名爲one的內存空間,隊列值爲5,便可以有5個請求排隊等待。 } } }

 本文轉載自https://www.abcdocker.com/abcdocker/586,感謝!

相關文章
相關標籤/搜索