Nginx的配置與開發學習(三):代理與緩存

Nginx進階

靜態資源WEB服務

  1. 靜態資源類型
類型 種類
瀏覽器端渲染 HTML,CSS,JS
圖片 JPEG,GIF,PNG
視頻 FLV,MPEG
文件 TXT,等任意下載文件
  1. 靜態資源服務場景-CDN(內容分發網絡)

內容分發網絡

        # 訪問本地絕對路徑下的靜態html    
        location / {
            #root   html;
            root /home/admin/XXX;
            index  index.html index.htm;
        }
        
        #訪問路徑拼接 /page
        location /page/ {
            alias /home/admin/XXX;
            autoindex on;
        }
  1. 文件讀取
  • http_gzip_static_module -預讀gzip功能

  • http_gunzip_module -應用支持gunzip的壓縮方式

    server {
        listen       80;
        server_name  localhost;
        
        sendfile on; #打開發送文件
        #charset koi8-r;
        access_log  /var/log/nginx/log/static_access.log  main;
    
        
        location ~ .*\.(jpg|gif|png)$ {  # 壓縮圖片的效率不是特別高
            gzip on;
            gzip_http_version 1.1;
            gzip_comp_level 2;
            gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
            root  /opt/app/code/images;
        }
    
        location ~ .*\.(txt|xml)$ {  #壓縮文本的效率挺高的
            gzip on;
            gzip_http_version 1.1;
            gzip_comp_level 1;
            gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
            root  /opt/app/code/doc;
        }
    
        location ~ ^/download { #目錄下的文件必須是壓縮文件,打開後就可以下載
            gzip_static on;
            tcp_nopush on;
            root /opt/app/code;
        }
        .......
    }
    
  1. 緩存,返回的Response頭中加入Cache-Control:max-age=86400

    server {
        listen       80;
        server_name  localhost;
        
        sendfile on; #打開發送文件
        #charset koi8-r;
        access_log  /var/log/nginx/log/static_access.log  main;
    
        
        location ~ .*\.(jpg|gif|png)$ {  # 壓縮圖片的效率不是特別高
            gzip on;
            gzip_http_version 1.1;
            gzip_comp_level 2;
            gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
            root  /opt/app/code/images;
        }
    
        location ~ .*\.(txt|xml)$ {  #壓縮文本的效率挺高的
            gzip on;
            gzip_http_version 1.1;
            gzip_comp_level 1;
            gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
            root  /opt/app/code/doc;
        }
    
        location ~ ^/download { #目錄下的文件必須是壓縮文件,打開後就可以下載
            gzip_static on;
            tcp_nopush on;
            root /opt/app/code;
        }
        
        location ~ .*\.(htm|html)${
            expires 24h; #響應返回頭中加入Cache-Control:max-age=86400
            root /opt/qpp/code;
        }
        .......
    }
    
  2. 跨域訪問

    • 不同域名之間的請求,在瀏覽器中一般是禁止的

    • 不安全,容易出現CSRF攻擊 你點了銀行A網站,攜帶了cookie,session之後不小心又去點了黑客B網站,B網站給客戶返回一些帶有惡意的Response請求,讓用戶去訪問銀行A網站。

      server {
          listen       80;
          server_name  localhost;
          
          sendfile on;
          #charset koi8-r;
          access_log  /var/log/nginx/log/static_access.log  main;
      
          
          location ~ .*\.(jpg|gif|png)$ {
              gzip on;
              gzip_http_version 1.1;
              gzip_comp_level 2;
              gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
              root  /opt/app/code/images;
          }
      
          location ~ .*\.(txt|xml)$ {
              gzip on;
              gzip_http_version 1.1;
              gzip_comp_level 1;
              gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
              root  /opt/app/code/doc;
          }
      
          location ~ .*\.(htm|html)$ {
              add_header Access-Control-Allow-Origin *; 
              add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
              #expires 24h;
              root  /opt/app/code;
          }
      
          location ~ ^/download {
              gzip_static on;
              tcp_nopush on;
              root /opt/app/code;
          }
          .......
      }
      
  3. 防盜鏈 :防止資源被盜用

    首要任務:區別哪些請求是非正常的用戶請求

    使用http_referer模塊

    server {
        listen       80;
        server_name  localhost;
        
        sendfile on;
        #charset koi8-r;
        access_log  /var/log/nginx/log/static_access.log  main;
    
        
        location ~ .*\.(jpg|gif|png)$ {
            gzip on;
            gzip_http_version 1.1;
            gzip_comp_level 2;
            gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
     
            valid_referers none blocked IP地址 ~/google\./;  ##正則匹配的方式來限制
            if ($invalid_referer) {
                return 403;
            }   #初級防盜鏈的設計,把refer信息限制爲本機IP地址
            root  /opt/app/code/images;
        }
    
        location ~ .*\.(txt|xml)$ {
            gzip on;
            gzip_http_version 1.1;
            gzip_comp_level 1;
            gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
            root  /opt/app/code/doc;
        }
    
        location ~ .*\.(htm|html)$ {
            expires 24h;
            root  /opt/app/code;
        }
    
        location ~ ^/download {
            gzip_static on;
            tcp_nopush on;
            root /opt/app/code;
        }
        .......
    }
    

代理服務

  1. 正向代理:代理的對象是客戶端

    翻牆:通過國外的一臺代理服務器實現翻牆

    admin.conf

   server {
       listen       80;
       server_name  localhost;
   
       #charset koi8-r;
       access_log  /var/log/nginx/log/host.access.log  main;
   
       location / {
           if ( $http_x_forwarded_for !~* "^XXX\.xx\.xxx\.xxx") { #判斷所有代理的IP信息
               return 403;
           }
           root   /opt/app/code;
           index  index.html index.htm;
       }
       ......
   }

zx_proxy.conf

   server {
       listen       80;
       server_name  localhost;
   
       #charset koi8-r;
       access_log  /var/log/nginx/test_proxy.access.log  main;
       resolver 8.8.8.8; #DNS解析
       location / {  
           proxy_pass http://$http_host$request_uri;
       }
       .......
   }

  1. 反向代理:代理的對象是服務端 不需要知道請求的服務器是哪一臺

realserver.conf 真正的服務器端口

server {
    listen       8080;#實際端口
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/server.access.log  main;

    location / {
        root   /opt/app/code2; #目錄下放置測試文件html
        index  index.html index.htm;
    }
    .......
}

fx_proxy.conf 代理的服務器配置

server {
    listen       80; #對外提供的端口
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/test_proxy.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    
    #location ~ /test_proxy.html$ { #當請求匹配爲test_proxy.html時,去請求本機的8080端口
    #    proxy_pass http://127.0.0.1:8080;
    #}
    ......
}

netstat -luntp|grep nginx  #查詢nginx配置中所啓動的端口號
  1. 代理服務配置模塊

    fx_proxy.conf 配置

    server {
        listen       80; #對外提供的端口
        server_name  localhost;
    
        #charset koi8-r;
        access_log  /var/log/nginx/test_proxy.access.log  main;
    
        location / {
            proxy_pass http://127.0.0.1:8080;
            include proxy_params;  ##可以把公用模塊的代理寫成一個文件,放在/etc/nginx下
            proxy_redirect default;
    
    		proxy_set_header Host $http_host;
    		proxy_set_header X-Real-IP $remote_addr;
    
    		proxy_connect_timeout 30;
    		proxy_send_timeout 60;
    		proxy_read_timeout 60;
    
    		proxy_buffer_size 32k;
    		proxy_buffering on;
    		proxy_buffers 4 128k;
    		proxy_busy_buffers_size 256k;
    		proxy_max_temp_file_size 256k;
        }
        ......
    }
    

Nginx負載均衡

客戶端請求經過Nginx,經過proxy_pass,放入虛擬的upstream server去分發到不同的服務上

  1. 登錄後臺服務器上,服務器上放了不同的服務

    服務器上有server1.conf,server2.conf,server3.conf配置,只有端口不同

    另一個負載均衡服務器上有upstream.conf,上面配置了3個不同的upstream監聽端口

        upstream baidu { #命名跟下面配置相同
            server ip:8001;
            server ip:8002;
            server ip:8003;
        }
    
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        access_log  /var/log/nginx/test_proxy.access.log  main;
        resolver  8.8.8.8;
        
        location / {
            proxy_pass http://baidu;
            include proxy_params;
        }
        ......
    }
    模擬宕機的時候,直接把請求的端口的入方向配置爲閉合
    iptables -I INPUT -p tcp --dport 8080 -j DROP
    恢復
    iptables -F
    

    調度算法:

輪詢 按時間順序逐一分配到不同的後端服務器
加權輪詢 weight值越大,分配到的訪問機率越高
ip_hash 每個請求按訪問IP的hash結果分配,這樣來自同一個IP的固定訪問一個後端服務器
url_hash 按照訪問的URL的hash結果來分配請求,是每個URL定向到同一個後端服務器
least_conn 最少鏈接數,那個機器連接數少就分發
hash關鍵數值 hash自定義的key

更多的upstream.conf配置

       upstream baidu {
           server IP:8001 down; //服務關閉,用不了
           server IP:8002 backup; //服務作爲備份,服務全部停止後才能用
           server IP:8003 max_fails=1 fail_timeout=10s; //服務連接失敗數,等待時間
       }
   
       #負載均衡策略 加權輪詢,基於請求分配
       upstream baidu {
           server IP:8001;
           server IP:8002 weight=5; #10個請求5個請求在8002上
           server IP:8003;
       }
   
       #基於請求會使 用戶cookie丟失,所以採用基於IP分配
       upstream baidu {
           ip_hash;
           server IP:8001;
           server IP:8002;
           server IP:8003;
       }
   
       #基於URL分配
       upstream baidu {
           hash $request_uri; #可以加入正則表達式判斷url中帶的參數
           server IP:8001;
           server IP:8002;
           server IP:8003;
       }
   
   server {
       listen       80;
       server_name  localhost;
   
       #charset koi8-r;
       access_log  /var/log/nginx/test_proxy.access.log  main;
       resolver  8.8.8.8;
       
       location / {
           proxy_pass http://baidu;
           include proxy_params;
       }
       .......
   }

緩存服務

cache.conf配置文件

    upstream baidu {
        server IP:8001;
        server IP:8002;
        server IP:8003;
    }

    proxy_cache_path /opt/app/cache levels=1:2 keys_zone=cyj_cache:10m max_size=10g inactive=60m use_temp_path=off;
   
    #臨時緩存文件目錄;根據目錄分級;zone空間的名字,與下對應;不活躍的60分鐘緩存文件自動清理
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/test_proxy.access.log  main;

    
    location / {
        proxy_cache cyj_cache;
        proxy_pass http://baidu;
        proxy_cache_valid 200 304 12h; ##過期時間12小時200,304返回頭
        proxy_cache_valid any 10m; ##其他10分鐘
        proxy_cache_key $host$uri$is_args$args;##緩存的key
        add_header  Nginx-Cache "$upstream_cache_status";  ##增加頭信息
        
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        include proxy_params;
    }
    .......
}

如何清理指定緩存:

  • rm -rf 緩存目錄內容
  • 第三方拓展模塊ngx_cache_purge
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章