02 - nginx - 反向代理、限速、URL重寫

1、Nginx反向代理

    代理服務器,客戶機在發送請求時,不會直接發送給目的主機,而是先發送給代理服務器.
    代理服務接受客戶機請求以後,再向主機發出,並接收目的主機返回的數據,存放在代理服務器的硬盤中,再發送給客戶機。 
    
    location / {
        proxy_pass http://118.190.209.153:4000;
        
    }
    
    OR (優化後得)
    
    location / {  
        index index.php index.html index.htm;     #定義首頁索引文件的名稱 
        proxy_pass  http://mysvr ;                #請求轉向mysvr 定義的服務器列表 
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        client_max_body_size 10m;                 #容許客戶端請求的大單文件字節數 
        client_body_buffer_size 128k;             #緩衝區代理緩衝用戶端請求的大字節數, 
        proxy_connect_timeout 90;                 #nginx跟後端服務器鏈接超時時間(代理鏈接超時) 
        proxy_send_timeout 90;                    #後端服務器數據回傳時間(代理髮送超時) 
        proxy_read_timeout 90;                    #鏈接成功後,後端服務器響應時間(代理接收 超時) 
        proxy_buffer_size 4k;                     #設置代理服務器(nginx)保存用戶頭信息 的緩衝區大小 
        proxy_buffers 4 32k;                      #proxy_buffers緩衝區,網頁平均在32k如下的話,這樣設置 
        proxy_busy_buffers_size 64k;              #高負荷下緩衝大小(proxy_buffers*2) 
        proxy_temp_file_write_size 64k;           #設定緩存文件夾大小,大於這個值,將從 upstream服務器傳 
    
    } 
    
    測試:
        killall nginx
        ../sbin/nginx
        10.0.0.200
    

 

2、Nginx限速

    
    1.限速介紹:
        限流(rate limiting)是NGINX衆多特性中有用的,也是常常容易被誤解和錯誤配置的,特性之一。
        該特性能夠限制某個用戶在一個給定時間段內可以產生的HTTP 請求數。
        請求能夠簡單到就是一個對於主頁的GET請求或者一個登錄表格的POST 請求。 
            
        限流也能夠用於安全目的上,好比減慢暴力密碼破解攻擊。
        經過限制進來的請求速率,而且(結合日誌)標記出目標URLs來幫助防範DDoS攻擊。
        通常地說,限流是用在保護上游應用服務器不被在同一時刻的大量用戶請求湮沒。
    
    
    2.應用場景
        DDOS防護
        下載場景保護IO
    
    
    3.限速原理    
        水(請求)從上方倒入水桶,從水桶下方流出(被處理);     
        來不及流出的水存在水桶中(緩衝),以固定速率流出;     
        水桶滿後水溢出(丟棄)。     
        這個算法的核心是:緩存請求、勻速處理、多餘的請求直接丟棄。     
        相比漏桶算法,令牌桶算法不一樣之處在於它不但有一隻「桶」,還有個隊列,
        這個桶是用來存放令牌的,隊列纔是用來存放請求的。 

        
    4.限速實現,實現方式:
        Nginx官方版本限制IP的鏈接和併發分別有兩個模塊:
        limit_req_zone 用來限制單位時間內的請求數,即速率限制。
        limit_req_conn 用來限制同一時間鏈接數,即併發限制。
    
    
    5.模塊使用方法
        limit_req_zone 參數配置
        Syntax: limit_req zone=name [burst=number] [nodelay];
        Default:    —
        Context:    http, server, location

    6.限速案例一:
        #基於IP對下載速率作限制,限制每秒處理1次請求,對突發超過5個之後的請求放入緩存區。
        http {     
            limit_req_zone $binary_remote_addr zone=baism:10m rate=1r/s;     
            server {         
                location /abc { 
                    limit_req zone=baism burst=5 nodelay;         
                } 
            }
        }            
        
        limit_req_zone $binary_remote_addr zone=baism:10m rate=1r/s; 
        
        第一個參數:$binary_remote_addr 表示經過remote_addr這個標識來作限制, 「binary_」的目的是縮寫內存佔用量,是限制同一客戶端ip地址。 
        第二個參數:zone=baism:10m表示生成一個大小爲10M,名字爲one的內存區域, 用來存儲訪問的頻次信息。 
        第三個參數:rate=1r/s表示容許相同標識的客戶端的訪問頻次,這裏限制的是每秒 1次,還能夠有好比30r/m的。 
        
        limit_req zone=baism burst=5 nodelay; 
        
        第一個參數:zone=baism 設置使用哪一個配置區域來作限制,與上面 limit_req_zone 裏的name對應。 
        第二個參數:burst=5,重點說明一下這個配置,burst爆發的意思,這個配置的意思是設置一個大小爲5的緩衝區當有大量請求(爆發)過來時,
            超過了訪問頻次限制的請求能夠先放到這個緩衝區內。 
        第三個參數:nodelay,若是設置,超過訪問頻次並且緩衝區也滿了的時候就會直接返回503,若是沒有設置,則全部請求會等待排隊。 
        
    
    7.限速案例二:
        #基於IP作鏈接限制,限制同一IP併發爲1  下載速度爲100K 
        
        limit_conn_zone $binary_remote_addr zone=addr:10m; 
 
        server {         
            listen       80;         
            server_name  localhost; 
            location / {             
                root   html;             
                index  index.html index.htm;         
            } 

            location /abc {            
                limit_conn addr 1;            
                limit_rate 100k;         
            } 
         
        }

        建立一個大文件:
        dd if=/dev/zero of=../html/abc/bigfile bs=1M count=300
        # 300M一個文件
        
        cd /tmp
        wget http://192.168./10.42/abc/bigfile    
    
    
    
    8.綜合案例:
        
        http {     
            include       mime.types;     
            default_type  application/octet-stream; 
            sendfile        on;     
            keepalive_timeout  65; 
            #基於IP作鏈接限制  限制同一IP併發爲1  下載速度爲100K limit_conn_zone $binary_remote_addr zone=addr:10m; 
            #基於IP對下載速率作限制  限制每秒處理1次請求,對突發超過5個之後的請求放入緩存區  
            
            limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;     
            server {         
                listen       80;         
                server_name  localhost; 
                location / {             
                    root   html;             
                    index  index.html index.htm;         
                } 
                location /abc { 
                   limit_req zone=one burst=5 nodelay;            
                   limit_conn addr 1;            
                   limit_rate 100k;         
                } 
         
            } 
         
        } 
    
    9.測試:
        cd /usr/local/nginx/conf
        vim nginx.conf
        
        ../sbin/nginx
        elinks http://192.168.10.52 --dump
        
        

 

3、URL重寫

    (
        cd /usr/local/nginx/conf
        netstat -ntpl
        killall nginx
        ../sbin/nginx
        
    )
    
    rewrite模塊(ngx_http_rewrite_module)
    
    應用場景:
        域名變動  (京東)
        用戶跳轉  (從某個鏈接跳到另外一個連接)
        僞靜態場景(便於cdn緩存動態頁面數據)
    
    URL 模塊語法:
        1) set     設置變量 
        2) if      負責語句中的判斷 
        3) return  返回返回值或URL 
        4) break   終止後續的rewrite規則 
        5) rewrite 重定向URL
        
    a. set指令   自定義變量 
        Syntax: set $variable value; 
        Default: 
        — 
        Context: server, location, if 
 
        將http://www.ayitula.com  重寫爲 http://www.ayitula.com/baism 
        location / {                 
            set $name baism;                 
            rewrite ^(.*)$ http://www.ayitula.com/$name;         
            }
            
    b. if 指令  負責判斷 
        Syntax: 
        if (condition) { ... } 
        Default: 
        — 
        Context: server, location 
 
        location / {                 
            root html;                 
            index index.html index.htm;                 
            if ($http_user_agent ~* 'Chrome') {                         
                break;                         
                return 403;                         
                #return http://www.jd.com;                 
            }         
        } 
 
        #模糊匹配   ~匹配  !~不匹配    ~* 不區分大小寫的匹配 
        #精確匹配   =      !=  
 
    c. return 指令   定義返回數據 
        Syntax: 
        return code [text]; 
        return code URL; 
        return URL; 
        Default: 
        — 
        Context: server, location, if  
 
        location / {                 
            root html;                 
            index index.html index.htm;        
            if ($http_user_agent ~* 'Chrome') {          
                return 403; 
                #return http://www.jd.com;             
            } 
        } 
    
    d. break 指令      中止執行當前虛擬主機的後續rewrite指令集 
        Syntax: break; 
        Default:
        — 
        Context:server, location, if 
 
        location / {                 
            root html;        
            index index.html index.htm;   
            if ($http_user_agent ~* 'Chrome') {        
                break;          
                return 403;   
            }        
        } 
    
    e. rewrite 模塊
        rewrite    <regex>    <replacement>    [flag];  
        關鍵字      正則       替代內容        flag標記 
        
        flag: 
            last        #本條規則匹配完成後,繼續向下匹配新的location URI規則 
            break       #本條規則匹配完成即終止,再也不匹配後面的任何規則 
            redirect    #返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址 
            permanent   #返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址        
            
        eg: 域名跳轉 www.ayitula.com     重寫爲  www.jd.com 
        
        server {         
            listen        80;         
            server_name www.ayitula.com;         
            location / {  
                rewrite ^/$ http://www.jd.com permanent ;                        
            } 
        }
        
        注意: 重定向就是將網頁自動轉向重定向 
        301永久性重定向:新網址徹底繼承舊網址,舊網址的排名等徹底清零 
        301重定向是網頁更改地址後對搜索引擎友好的好方法,只要不是暫時搬移的狀況,都建議使用301來作轉址。 
        302臨時性重定向:對舊網址沒有影響,但新網址不會有排名     搜索引擎會抓取新的內容而保留舊的網址 
        
        #########################################################################
        
        break  相似臨時重定向 
        
        根據用戶瀏覽器重寫訪問目錄 
        若是是chrome瀏覽器  就將  http://192.168.10.42/$URI   重寫爲  http://http://192.168.10.42/chrome/$URI 
        實現步驟 
            1)URL重寫 
            2)請求轉給本機location 
 
 
        location / { 
            ..... 
            if ($http_user_agent ~* 'chrome'){           
                #^ 以什麼開頭 ^a           
                #$ 以什麼結尾 c$           
                #. 除了回車之外的任意一個字符           
                #* 前面的字符能夠出現屢次或者不出現           
                # 更多內容看正則表達式 re           
                rewrite ^(.*)$ /chrome/$1 last;           
            } 
         
            location /chrome {   
                root html ; 
                index index.html; 
            } 
        }
        
        url重寫後,立刻發起一個新的請求,再次進入server塊,重試location匹配,
        超過 10次匹配不到報500錯誤,地址欄url不變 last 通常出如今server或if中   
 
        數據包走向   
        client-->nginx nginx告訴客戶端讓服務器的新地址(真實服務器)
        客戶端收到後再去找服務器 client--->server 
    
    練習:
 
    # 訪問 /baism00.html 的時候,頁面內容重寫到 /index.html 中     
    rewrite /baism00.html /index.html last; 
 
    # 訪問 /baism01.html 的時候,頁面內容重寫到 /index.html 中,並中止後續的匹配     
    rewrite /baism01.html /index.html break; 
 
    # 訪問 /baism02.html 的時候,頁面直接302定向到 /index.html中     
    rewrite /baism02.html /index.html redirect;   // 302 臨時,redirect 
 
    # 訪問 /baism03.html 的時候,頁面直接301定向到 /index.html中     
    rewrite /baism03.html /index.html permanent;  // 301 永久,permanent
 
    # 把 /html/*.html => /post/*.html ,301定向     
    rewrite ^/html/(.+?).html$ /post/$1.html permanent; 
 
    # 把 /search/key => /search.html?keyword=key     
    rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent; 
    
    
    
相關文章
相關標籤/搜索