Nginx日志相關優化與安全
日志切割腳本如下:
#!/bin #日志切割腳本 Date=`date +%Y%m%d` Bdir="/usr/local/nginx" Nginxlogdir="$Bdir/logs" Logname="access" [ -d $Nginxlogdir ] && cd $Nginxlogdir ||exit 2 [ -f "$Logname".log ] ||exit 3 /bin/mv "$Logname".log "$Date"_"$Logname".log $Bdir/sbin/nginx -s reload find "$Nginxlogdir" -name "$Logname*" -type f -mtime +7|xargs /bin/rm
將腳本放入定時任務完成切割
不記錄不需要的訪問日志
在實際工作中,對於負載均衡器健康節點檢查或某些特定文件(比如圖片,JS,CSS)的日志,一般不需要記錄下來,因為在統計PV時是按照頁面計算的,而且日志寫入太頻繁會消耗大量磁盤I/O,降低服務的性能。
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
access_log off;
}
#這里用location標簽匹配不記錄日志的元素擴展名,然后關閉日志
訪問日志的權限設置
假如日志目錄為/app/logs,則授權方法如下:
chown -R root.root /app/logs chown -R 700 /app/logs
#不需要在日志目錄上給Nginx用戶讀或寫許可,但很多網友都沒注意這個問題,他們把該權限直接給了Nginx或Apache用戶,這就成為了安全隱患。
Nginx站點目錄及文件URL訪問控制
配置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處理PHP服務配置的前面,如下: location ~ .*\.(php|php5)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; }
Nginx下配置禁止訪問*.txt和*.doc文件
location ~* \.(txt|doc)$ { if (-f $request_filename) { root /data/www/www; #rewrite ...可以重定向到某個URL #URL重寫 break; } }
或 location ~* \.(txt|doc)$ { root /data/www/www; deny all; #權限拒絕 }
禁止訪問指定目錄下的所有文件和目錄
配置禁止訪問指定的單個或多個目錄
#禁止訪問單個目錄的命令如下: location ~ ^/static { deny all; } #禁止訪問多個目錄的命令如下: location ~ ^/(static|js) { deny all; }
禁止訪問目錄並返回指定的HTTP狀態碼,命令如下:
server { listen 80; server_name www.wk.com wk.com; root /data/www/www; index index.html index.htm; access_log logs/www_access.log commonlog; location /admin/ { return 404; } location /tmplates/ { return 403; } }
限制網站來源IP訪問
禁止某目錄讓外界訪問,但允許某IP訪問該目錄,且支持PHP解析,命令如下:
location ~ ^/wk/ #此為 改域名下禁止訪問的目錄 { allow 202.111.12.211; deny all; } location ~ .*\.(php|php5)$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; }
限制指定IP或IP段訪問,命令如下:
location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; deny all; }
企業問題案例: Nginx做反向代理的時候可以限制客戶端IP嗎?
if ($remote_addr = 10.0.0.7) { return 403; } if ($remote_addr = 218.247.17.130) { set $allow_access_root 'ture'; #我也不知道什么意思 }
利用deny和allow只允許IP訪問
location / { root html/blog; index index.php index.html index.htm; allow 10.0.0.7; deny all; }
只拒絕某些IP訪問,命令如下:
location / { root html/blog; index index.php index.html index.htm; deny 10.0.0.7; allow all; }
配置Nginx,禁止非法域名解析訪問企業網站
Nginx如何防止用戶IP訪問網站(惡意域名解析,也相當於是直接IP訪問企業網站)
(1)讓使用IP訪問網站的用戶,或者惡意解析域名的用過戶,收到501錯誤,命令如下:
server { listen 80 default_server; server_name _; return 501; } #說明:直接報501錯誤,從用戶體驗上不是很好
(2)通過301跳轉到主頁,命令如下:
server { listen 80 default_server; server_name _; rewrite ^(.*) http://www.wk.com/$1 permanent; }
(3)發現某域名惡意解析到公司的服務器IP,在server標簽里添加以下代碼即可,若有多個server則要多處添加。
if ($host ! ~ ^www\.wk\.com$) { rewrite ^(.*) http://www.wk.com/$1 permanent; } #說明:代碼含義為如果header信息的host主機名字非www.yunjisuan.com,就301跳轉到www.yunjisuan.com
Nginx圖片及目錄防盜鏈解決方案
盜鏈的影響
最直接的影響就是網絡帶寬占用加大了,帶寬費用多了,網絡流量也可能忽高忽低,Nagios/Zabbix等報警服務頻繁報警最嚴重的情況就是網站的資源被非法使用,使網站帶寬成本加大和服務器壓力加大,這有可能導致數萬元的損失,且網站的正常用戶訪問也會受到影響。
如何及時發現
(1)對IDC及CDN帶寬做監控報警
(2)作為高級運維或運維經理,每天上班的重要任務,就是經常查看網站流量圖,關注流量變化,關注異常流量.
(3)對訪問日志做分析,迅速定位異常流量,並且和公司市場推廣等保持較好的溝通,以便調度帶寬和服務器資源,確保網站正常的訪問體驗。
常見防盜鏈解決方案的基本原理
(1)根據HTTP referer實現防盜鏈
在HTTP協議中,有一個表頭字段叫referer,使用URL格式來表示是哪里的鏈接用了當前網頁的資源。通過referer可以檢測訪問的來源網頁,如果是資源文件,可以跟蹤到顯示它的網頁地址,一旦檢測出來源不是本站,馬上進行阻止或返回指定的頁面。
HTTP referer是header的一部分,當瀏覽器向Web服務器發送請求時,一般會帶上referer,告訴服務器我是從哪個頁面鏈接過來的,服務器借此獲得一些信息用於處理。Apache,Nginx,Lighttpd三者都支持根據HTTP referer實現防盜鏈,referer是目前網站圖片,附件,html等最常用的防盜鏈手段。下圖是referer防盜鏈的基本原理圖。
(2)根據cookie防盜鏈
(3)通過加密變換訪問路徑實現防盜鏈
實現防盜鏈
(1)利用referer,並且針對擴展名rewrite重定向
#下面的代碼為利用referer且針對擴展名rewrite重定向,即實現防盜鏈的Nginx配置。 location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ { valid_referers none blocked *.wk.com wk.com; # if ($invalid_referer) { rewrite ^/ http://www.wk.com/img/nolink.jpg; } } #提示:要根據自己公司的實際業務(是否有外鏈的合作)進行域名設置。
(2)利用referer,並且針對站點目錄過濾返回錯誤碼
針對目錄的方法如下:
location /images { root /data/www/www; valid_referers none blocked *.yunjisuan.com yunjisuan.com; if ($invalid_referer) { return403; } }
Nginx錯誤頁面的優雅顯示
生產環境常見的HTTP狀態碼列表
200 #服務器成功返回網頁,這是成功的http請求返回的標准狀態碼
301 #永久跳轉,所有請求的網頁將永久跳轉到被設定的新位置,例如:從etiantian.org跳轉到www.etiantian.org
403 #禁止訪問,這個請求是合法的,但是服務器端因為匹配了預先設置的規則而拒絕響應客戶端的請求,此類問題一般為服務器權限配置不當所致
404 #服務器找不到客戶端請求的指定頁面,可能是客戶端請求了服務器不存在的資源所導致的
500 #內部服務器錯誤,服務器遇到了意料不到的情況,不能完成客戶的請求。這是一個較為籠統的報錯,一般為服務器的設置或內部程序問題所致
502 #壞的網關,一般是代理服務器請求后端服務時,后端服務不可用或沒有完成響應網關服務器。一般為代理服務器下面的節點出了問題所致
503 #服務當前不可用,可能為服務器超載或停機維護所致,或者是代理服務器后面沒有可以提供服務的節點
504 #網關超時,一般是網關代理服務器請求后端服務時,后端服務沒有在特定的時間內完成處理請求,一般為服務器過載所致,沒有在指定的時間內返回數據給代理服務器
為什么要配置錯誤頁面優雅顯示
在網站的運行過程中,可能因為頁面不存在或系統過載等原因,導致網站無法正常響應用戶的請求,此時Web服務會返回系統默認的錯誤碼,或者很不友好的頁面
我們可以將404,403等的錯誤信息頁面重定向到網站首頁或其他事先指定的頁面,提升網站的用戶訪問體驗。
優雅顯示
(1)對錯誤代碼403實行本地頁面跳轉,命令如下:
server { listen 80; server_name www.wk.com; location / { root html/www; index index.html index.htm; } error_page 403 /403.html; #當出現403錯誤時,會跳轉到403.html頁面 } #上面的/403.html是相對於站點根目錄html/www的。
(2)對錯誤代碼404實行本地頁面優雅顯示,命令如下:
server { listen 80; server_name www.wk.com; location / { root html/www; index index.html index.htm; error_page 404 /404.html; #當出現404錯誤時,會跳轉到404.html頁面 } } #代碼中的/404.html是相對於站點根目錄html/www的
(3)50x頁面放到本地單獨目錄下,進行優雅顯示
error_page 500 502 503 504 /50x.html; location = /50x.html { root /data/www/html; } #這里指定單獨的站點目錄存放到50x.html文件中。
(4) 錯誤狀態碼URL重定向,命令如下:
server { listen 80; server_name www.wk.com; location / { root html/www; index index.html index.htm; error_page 404 http://bbs.wk.com; #當出現404錯誤時,會跳轉到指定的URL http://bbs.wk.com頁面顯示給用戶,這個URL一般是企業另外的可用地址。 access_log /usr/local/nginx/logs/bbs_access.log commonlog; } } #代碼中的/404.html是相對於站點根目錄html/www的。
(5)將錯誤狀態碼重定向到一個location,命令如下:
location / { error_page 404 = @fallback; } location @fallback { proxy_pass http://backend; }
Nginx站點目錄文件及目錄權限優化
單機LNMP環境目錄權限嚴格控制措施
為了保證網站不遭受木馬入侵,所有站點目錄的用戶和組都應該為root,所有的目錄權限是755;所有的文件權限是644.
chmod -R 777 /directory chmod -R nginx.nginx /directory
Nginx企業網站集群超級安全設置
結合Linux權限體系及Nginx大型集群架構進行配置,嚴格控制針對Nginx目錄的訪問才能降低網站被入侵的風險
| 服務器角色 | 權限處理 | 安全系數 |
|---|---|---|
| 動態Web集群 | 目錄權限755,文件權限644,所用目錄,以及文件用戶和組都是root。環境為Nginx+PHP | 文件不能被改,目錄不能被寫入,安全系數10 |
| static圖片集群 | 目錄權限755,文件權限644,所用的目錄,以及文件用戶和組都是root。環境為Nginx | 文件不能被改,目錄不能被寫入,安全系數10 |
| 上傳upload集群 | 目錄權限755,文件權限644,所用的目錄,以及文件用戶和組都是root。特別:用戶上傳的目錄設置為755,用戶和組使用Nginx服務配置的用戶 | 文件不能被改,目錄不能被寫入,但是用戶上傳的目錄允許寫入文件且需要通過Nginx的其他功能來禁止讀文件,安全系數8 |
