Nginx優化之日志優化,URL訪問控制,防盜鏈,及站點文件目錄優化


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM