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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值