Nginx-实践篇

Nginx-实践篇

一、静态资源WEB服务:

  • 客户端→(REQ:jpeg、html、flv)→Nginx→静态文件

1、静态资源类型:

  • 非服务器动态运行生成的文件

    类型 种类
    浏览器端渲染 HTML、CSS、JS
    图片 JPEG、GIF、PNG
    视频 FLV、MPEG
    文件 TXT、等任意下载文件

2、静态资源服务场景-CDN(内容分发网络):

  • CDN起到作用就是传输延迟的最小化,举个栗子:

在这里插入图片描述

3、配置语法

配置语法—文件读取:
  • 语法:
    • Syntax: sendfile on | off;
    • Default:sendfile off;
    • Context:http,server, location, if in location
  • 引读:—with-file-aio 异步文件读取
配置语法—tcp_nopush:
  • 语法:
    • Syntax:tcp_nopush on |off;
    • Default: tcp_nopush off;
    • Context: http, server , location
  • 作用:sendfile开启的情况下,提高网络包的传输效率
配置语法—tcp_nodelay:
  • 语法:
    • Syntax: tcp_nodelay on |off;
    • Default: tcp_nodelay on;
    • Context: http, server , location
  • 作用:keepalive连接下,提高网络包的传输实时性
配置语法—压缩:
  • 语法:

    • Syntax: gzip on | off;
    • Default: gzip off;
    • Context: http, server ,location, if in location
  • 作用:压缩传输

  • 图解:

在这里插入图片描述

配置语法—压缩比:
  • 语法:
    • Syntax: gzip _comp_level level;
    • Default: gzip_comp_level 1;
    • Context: http, server , location
配置语法—控制压缩版本:
  • 语法:
    • Syntax: gzip_http_version 1.0| 1.1;
    • Default: gzip_http_version 1,1;
    • Context:http, server ,location
扩展Nginx压缩模块:
  • http_gzip_static_modile-预读gzip功能
  • http_gunzip_module - 应用支持gunzip的压缩方式
  • 视频观看到3-5 07.55 刚配置完txt的文件
创建一个static_conf.conf文件,进行静态文件的配置:
server {
    listen       80;
    server_name  192.168.37.129;

    sendfile on;
    #charset koi8-r;
    access_log  /var/log/nginx/log/static_access.log;


    location ~ .*\.(jpg|gif|png)$ {  # 以图片类型结尾的url 就从下面查找
        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)$ {   #  如果以为txt文件或者xml结尾的url,就从下面找
       gzip off;
       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 {   #  以为download开头的url,就从下面查找
        gzip_static on;  # 下载文件
        tcp_nopush on;
        root /opt/app/code;
    }
}
首先举个图片压缩的栗子:
  • 把所有的static_conf.conf 文件都关掉,请求/opt/app/code/images/里面有个python.jpg的图片(这个目录是我创建好的)

  • 通过servername 进行访问 127.0.0.1/python.jpg

    • 点击浏览器开发者工具点击Network 可以看到这次请求的大小Size
  • 配置:

    • gzip on;打开

          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;   # 目录
          }
      
      
  • 清除浏览器缓存再次访问,127.0.0.1/python.jpg,打开开发者工具种的Netwrok可以看到请求的Size多少

举个文本文件压缩的栗子:
  • 步骤同上:

  • 配置:

    • gzip on:打开

        location ~ .*\.(txt|xml)$ {
             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/doc;   # 再该目录下创建一个.txt或者.xml文件   
          }
      
  • 清除浏览器缓存继续访问:127.0.0.1/log.txt, 打开浏览器开发者工具Network,观察Size,跟没压缩的时候对比,文本文件还是明现的。

4、浏览器缓存:

  • HTTP协议定义的缓存机制(如:Expires; Cache-control等),客户端可以直接从本地读取到,不去大量的访问服务器,减轻服务器的压力。
一、浏览器无缓存:

在这里插入图片描述

二、客户端有缓存:

在这里插入图片描述

  • 如果该缓存没有过期的话, 不需要客户端再去请求服务器进行呈现。
三、校验过期机制:
校验是否过期 Expires(请求头1.0版本)、Cache-Control(max-age)(请求头1.1版本)
协议中Etag头信息校验 Etag(本地缓存失效,请求服务器)-后面携带字符串作为标识
Last-Modified头信息校验 Last-Modified(本地缓存失效,请求服务器)-后面携带具体时间

在这里插入图片描述

四、配置语法 - expires:
  • 添加Cache-Control、Expires头

    • Syntax:expires [modified] time;
    • Default: expires off;
    • Context: http, server , location, if in location
  • 当再次请求服务器的时候,会发现Status Code:304 Not Modified:说明该请求是从缓存中读取,也会发现Request Headers里面多出个Cache-Control: max-age=0或者max-age<0:意思就是每一次请求都去服务器进行校验,是否有更新,如果有更新返回200,如果没有更新就返回304

  • 把配置项打开,栗子如下:

     location ~ .*\.(htm|html)$ {
            expires  24h;
            root /opt/app/code;
     }
    
    • 会发现再Response Headers里面多出了Cache-Control: max-age=86400,过期时间, 24小时。

5、跨域访问:

一、跨域概念:
  • 举个栗子:

    在这里插入图片描述

    • 浏览器访问a.com的时候,再a.com的页面中通过ajax去访问了,b.com,形成了跨域的请求,容易引起csrf(跨站性)攻击。
二、Nginx基本设置跨站请求:
  • 语法:

    • Syntax: add_header name value [always];
    • Default: -
    • Context: http, server ,location, if in location
    • 浏览器请求的时候会判断response头中Access-Control-Allow-Origin
  • 举个栗子:

    • 再nginx.conf 配置项里面打开:

      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;
          }
      
      
    • add_header Access-Control-Allow-Origin wwww.xxx.com的意思是指允许www.xxx.com的域名进行跨域请求。

    • add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS的意思是指请求的方法。

    • add_header Access-Control-Allow-Origin *,*代表的是允许所有网站跨域请求,这种做法是不安全的。

6、Nginx防盗链:

一、目的:
  • 防止网站资源被占用。
二、防盗链设置思路:
* 首要方式:区别哪些请求是非正常的用户请求。
三、基于http_refer防盗链配置模块:
  • 语法:

    • 举个栗子:

      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;
       # 下面就是nginx防盗链的配置
              valid_referers none blocked 192.168.27.139/python.jpg ~wei\.png;
              if ($invalid_referer) {
                  return 403;
              }
              root  /opt/app/code/images;
          }
      
      
      • valid_referers: 表示允许哪些信息访问。
      • none:表示没有带referers信息的访问。
      • blocked:表示一些不需要带http://这样访问,可以是一些非这样的请求。
    • 可以通过curl -I 192.168.27.139/python.jpg来查看返回的响应头信息。

二、代理服务:

  • 图解一下代理的过程:

    在这里插入图片描述

  • 图解一下代理服务:

    在这里插入图片描述

1、HTTP代理:

一、正向代理:
  • 图解一下:

    img

  • 举个栗子:

    • 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

    • 客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。

    • 总体来说:

      • 正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端客户端必须要进行一些特别的设置才能使用正向代理。
    • 正向代理的用途:

      • (1)访问原来无法访问的资源,如google。
      • (2) 可以做缓存,加速访问资源 。
      • (3)对客户端访问授权,上网进行认证 。
      • (4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息 。
二、反向代理:
  • 图解一下:

    img

  • 概念:

    • 反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
  • 总体来说:

    • 客户端是无感知代理的存在的,反向代理对外都是透明的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问 。
  • 反向代理作用:

    • (1)保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击 。

      • 大型网站,通常将反向代理作为公网访问地址,Web服务器是内网。

      • 图解如下:

        img

    • (2)负载均衡,通过反向代理服务器来优化网站的负载。

      • 图解如下:

        img

三、代理区别:
  • 区别在于代理对象不一样。
  • 正向代理:代理的对象是客户端。
  • 方向代理:代理的是服务端。
四、配置语法:
  • 语法:

    • Syntax:proxy_pass URL
    • Default:-
    • Context:location, if in location, limit_except
    • URL:支持http 或 https协议,也支持Socket方式
  • 查看nginx这个进程, 所启用的端口命令netstat -luntp | grep nginx

  • 举个栗子:

    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$ {   
            proxy_pass http://127.0.0.1:8080;
        }
    
    • 外网只能访问127.0.0.1:80/test_proxy.html的时候, 通过proxy_pass方向代理到8080端口,如下。

      server {
          listen       8080;
          server_name  localhost;
      
          #charset koi8-r;
          access_log  /var/log/nginx/server.access.log  main;
      
          location / {
              root   /opt/app/code2;
              index  index.html index.htm;
          }
      
五、其他配置语法:
缓冲区:
  • 语法:
    • Syntax: proxy_buffering on | off ;
    • Default : proxy_buffering on;
    • Context: http,server , location
  • 扩展:
    • proxy_buffer_size 、 proxy_buffers、proxy_busy_buffers_size
  • 优点:
    • 打开会减少IO的访问, 存储再内存中,当内存不够,就会存储到相对应的硬盘中。
跳转重定向:
  • 语法:
    • Syntax: proxy_rediect default;
    • proxy_redirect off ; proxy_redirect redirect replacement;
    • Defalut: proxy_redirect defalut;
    • Context: http, server , location
  • 使用场景:
    • 当用Nginx代理服务器,代理后端返回301重定向地址的时候,他会把请求重定向到别的地址中
    • 当后端返回的301状态地址的时候,前端用不到这个地址, 这时候Nginx这个参数就有了作用,可以重写,一般情况下都是默认。
头信息:
  • 语法:
    • Syntax: proxy_set_header field value;
    • Default:
      • proxy_set_header Host $proxy_host;
      • proxy_set_header Connection clost;
    • Context: http, server ,location ;
  • 扩展:
    • proxy_hide_header、proxy_set_body
超时:
  • 语法:
    • Syntax: proxy_connect_timeout time;
    • Default: proxy_connect_timeout 60s;
    • Context: http,server ,location
  • Nginx超时作为代理带后端连接的超时。
  • 扩展:
    • proxy_read_timeout、proxy_send_timeout
    • read_timeout: 已经建立好了连接了,服务器接收请求,到处理请求的这段时间超时。
    • send_timeout: 服务端请求完了, 再发送给客户端的时候超时。
六、代理服务—配置和规范:
  • 举个栗子:

    location / {
        proxy_pass localhost; # 必须要的跳转配置
        proxy_redirect default;  # 默认default:后端返回301 就需要这个进行改写 
    
        proxy_set_header Host $http_host;  # 请求后端接口的时候,添加的请求头信息 添加HOST头信息
        proxy_set_header X-Real-IP $remote_addr; # 把真实的IP信息带到前端去
    
        proxy_connect_timeout 30; # TCP请求连接超时的限制
        proxy_send_timeout 60;  
        proxy_read_timeout 60;
    
        proxy_buffer_size 32k;  # 缓冲区请求头部的大小,一般情况不会超过32k
        proxy_buffering on; # 打开以后可以频繁的减少IO
        proxy_buffers 4 128k; # 设置buffer的大小
        proxy_busy_buffers_size 256k;
        proxy_max_temp_file_size 256k;  # 如果文件过大,会存储到临时的文件中
        # --http-proxy-temp-path=/var/lib/nginx/proxy 缓冲区临时文件的存储位置
    }
    
  • 如果每个配置项都是相同的,可以把每个配置项放到一个文件里面:

    • 举个栗子, 把上面的那些location里面的配置项都放到一个文件里,不必配置一个location就需要写一堆配置:

      location / {
          proxy_pass localhost; # 必须要的跳转配置
          include  proxy_params;  # 再当前文件所在目录中创建一个文件 叫proxy_params 里面放上面的配置项
      }
      

三、负载均衡调度器SLB:

1、Nginx负载均衡:

  • 首先客户端大量请求服务器的时候,会造成大量的并发,导致服务器没有办法及时的返回数据,这时候用Nignx来做负载均衡,可以配置多台服务器,当服务器1宕掉了,服务器2也可以进行访问,让服务的高可用,能够更满足业务的需求。

  • 图解:

    在这里插入图片描述

一、基于LVS的中间件架构:
GSLB(全局性的负载均衡):
  • 图解:

    在这里插入图片描述

  • 概念:

    • GSLB:范围比较广,地域的划分基本上都是以国家,或者省份为单位。
SLB:
  • 图解:

    在这里插入图片描述

  • 往往调度节点跟服务节点都在一个地域里面。

2、四层负载均衡和七层负载均衡:
四层负载均衡
  • 客户端→(Layer4)→服务端
    • 所谓的四层负载均衡,就是再OSI模型里面传输层,传输层能支持到T4P IP协议的控制,所以只需要对客户端的请求,进行T4p IP协议的包转发
    • 优点:
      • 简单、快速、不需要太复杂的逻辑
七层负载均衡
  • 客户端→(Layr7{TCP/IP})→服务端
  • 处理应用层,如:http信息
  • 优点:
    • 能完成很多应用方面的请求, 能实现头信息的改写,安全应用的控制。

2、Nginx负载均衡实现原理:

  • 客户端通过→Nginx(proxy_pass) →转发到一组虚拟的服务池(upstream server)→upstream server(可以定义很多服务器的单元进行轮询请求)

  • 图解:

    在这里插入图片描述

3、Nginx负载均衡配置语法:

一、基本配置语法:
  • 语法:

    • Syntax:upstream name {…}
    • Default:—
    • Context:http
      • 注意:配置项的位置,必须再server层以外
  • 首先我有2台服务器:

    • IP地址分别为:

      • 192.168.37.129(被负载的服务器) A服务器
      • 192.168.65.197 (客户端访问这个IP地址)B服务器
    • 首先再A服务器上面,创建配置文件:

      • 创建第一个配置项, server1.conf:

        server {
            listen       8001;
            server_name  localhost;
        
            #charset koi8-r;
            access_log  /var/log/nginx/log/server1.access.log;
        
            location / {
                root   /opt/app/code1;   # 路径下面有对应的文件 index.html 
                index  index.html index.htm;
            }
        }
        
      • 再创建第二个配置项, server2.conf

        server {
            listen       8002;
            server_name  localhost;
        
            #charset koi8-r;
            access_log  /var/log/nginx/log/server1.access.log;
        
            location / {
                root   /opt/app/code2;   # 路径下面有对应的文件 index.html 
                index  index.html index.htm;
            }
        }
        
      • 再创建第三个配置项,server3.conf

        server {
            listen       8003;
            server_name  localhost;
        
            #charset koi8-r;
            access_log  /var/log/nginx/log/server1.access.log;
        
            location / {
                root   /opt/app/code3;   # 路径下面有对应的文件 index.html 
                index  index.html index.htm;
            }
        }
        
      • 会发现就是端口不一样, 访问的静态资源路径也是不一样的

    • 再B服务器上修改Nginx配置项:

      • 打开nginx.conf 主配置文件:

        # 首次按tomcat_server 必须跟下面的 location / {} 里面的 proxy_pass http:// `tomcat_server` 名字是一样的
        upstream tomcat_server {
                #设定负载均衡的服务器列表
                      server 192.168.37.129:8001;  # 就是A服务器上面的启动的8001端口
        
                      server 192.168.37.129:8002;  # 就是A服务器上面的启动的8002端口
        
                      server 192.168.37.129:8003; # 就是A服务器上面的启动的8003端口
                }
            server {
                listen       80;   # B服务器的端口
                server_name  localhost;  # B服务器的IP地址
        
                #charset koi8-r;
        
                #access_log  logs/host.access.log  main;
        
                location / {
                    proxy_buffering off;
                    proxy_pass http://tomcat_server;
                    root   html;
                    index  index.html index.htm;
                }
        
                #error_page  404              /404.html;
        
                # redirect server error pages to the static page /50x.html
                #
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   html;
                }
        }
        
    • 访问过程:

      • 首先配置完Nginx的配置项:

        • 第一步.nginx -t : 检查Nginx 配置文件是否正确:

          • 如果出现, 那恭喜你配置成功:

            nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
            nginx: configuration file /etc/nginx/nginx.conf test is successful
            
          • 如果出现报错信息, 去相对应的行号寻找就好。

        • 第二步.nginx -s reload : 平缓的重启Nginx服务器

      • 访问B服务器的IP地址,我这里设置的B服务器IP地址是 localhost 端口是80.

      • 就会反向代理到A服务器上, 去轮询的请求 A服务器的8001端口,8002端口,8003端口。

      • 这就实现了Nginx的负载均衡,可以让服务器高可用性更强,处理大量的并发事件更容易些,性能更快一些。

    • 如果您不知道访问的哪个端口,无法做明现的判断:

      • 再A服务器上的server.conf配置项中:

         root   /opt/app/code1;   # 路径下面有对应的文件 index.html 
        		index  index.html index.htm;
        
      • 再/opt/app/code1/目录下,创建一个 index.html 文件

      • 文件内容如下:

        <html>
        <head>
            <meta charset="utf-8">
            <title>server3</title>
        </head>
        <body style="background-color:green;">
            <h1>Server 3<h1>
        </body>
        </html>
        
        
      • 再8002, 8003 端口都配置相同的文件,加以区分。

二、Upstream举例:
  • upstream 举例:

    upstream backend {  # backend: 组的名字
        server upstream backend1.example.com weight=5;  # 可以支持ip的写法,也支持域名的方式
        server upstream backend2.example.com:8080;
        server unix:/tmp/backend3;  # 也可以支持socket 的方式来写
        
        server backup1.example.com:8080  backup;  # backup 表示是备份的节点  
        server backup2.example.com:8080  backup;  # weight 表示是权重节点,对于轮询方式而言,参数越大,轮询到的概率越大
    }
    
三、服务器再负载均衡调度中的状态:
down 当前的server暂时不参与负载均衡
backup 预备的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后,服务暂停的时间
max_conns 限制最大的接收连接数
 upstream tomcat_server {
              server 192.168.37.129:8001 down;

              server 192.168.37.129:8002 backup;

              server 192.168.37.129:8003 max_fails=1 fail_timeout=10s; 
        }
四、Nginx调度算法:
轮询 按时间顺序逐一分配到不同的后端服务器
加权轮询 weight值越大,分配到的访问几率越大
ip_hash 每个请求按访问IP的hash结果分配,这样来自同一个IP的固定访问一个后端服务器
url_hash 按照访问的URL的hash结果分配请求,是每个URL定向到同一个后端服务器
least_conn 最少链接数,那个机器链接数少就分发
hash关键数值 hash自定义的key
  • 加权轮询:

     upstream tomcat_server {
                  server 192.168.37.129:8001;
    
                  server 192.168.37.129:8002 weight=5;
    
                  server 192.168.37.129:8003; 
            }
    
    • 假如有7个请求,8002端口会接收到5个请求。
    • 总结:加权轮询跟轮询都是基于请求来进行分配如果不想依赖请求的话,想把cookie和seesion的信息进行保存一致,要不然用户再请求页面的时候,访问不同的服务区,会导致一些重新登录的场景,可以用下面的方法ip_hash
  • ip_hash:

    upstream tomcat_server {
        		 ip_hash;
                  server 192.168.37.129:8001;
    
                  server 192.168.37.129:8002;
    
                  server 192.168.37.129:8003; 
            }
    
    • 每个用户登入的时候,带过来的IP地址,都会绑定到一台服务器上,下次访问的时候还会访问该服务器。
    • 缺陷:
      • 如果客户端用代理的方式来进行访问,而不是真是的IP地址,这样ip_hash作用就没有那么大了。
  • url_hash配置语法:

    • Syntax: hash key [consistent];
    • Default:—
    • Context:upstream
    • 版本适用于1.7.2以后才推出的

四、动态缓存:

1、缓存类型:

  • 首先用到缓存就是为了减少后端服务器的压力,让所有的请求最好都集中到前端就能请求到数据。
分为:
一:客户端缓存
二:代理缓存
三、服务端缓存
  • 客户端(客户端缓存)→Nginx(代理缓存)→服务端(服务端缓存)

2、代理缓存Nginx:

在这里插入图片描述

  • 1:当客户端请求Nginx代理的时候,Nginx本地没有缓存。
  • 2:Nginx就需要去请求服务层。
  • 3:拿到的数据保存到Nginx本地。
  • 4:把响应返回给客户端。
  • 1:客户端再次请求服务端的时候,通过Nginx代理的时候,Nginx本地有从服务端拿到的数据,缓存了本地。
  • 2:把Nginx缓存本地的数据,直接返回给客户端,就不需要去请求服务层。

3、缓存服务核心的配置(proxy_cache):

  • 配置语法:
    • Syntax:proxy_cache_path path [levels=levels]
    • Default:—
    • Context:http
  • 定义好path后:
    • Syntax:proxy_cache zone | off;
    • Default:proxy_cache off;
    • Context:http,server, location;
  • 缓存过期周期:
    • Syntax:proxy_cahe_vaild [code…] time;
    • Default:—
    • Context:http,server, location
  • 缓存的维度:
    • Syntax:proxy_cache_key string;
    • Default:proxy_cache_key s c h e m e scheme proxy_host$request_uri;
    • Context: http,server,location

4、Nginx作为缓存服务的场景配置:

    upstream tomcat {
        server 116.62.103.228:8001;
        server 116.62.103.228:8002;
        server 116.62.103.228:8003;
    }

    proxy_cache_path /opt/app/cache levels=1:2 keys_zone=fe_cow:10m max_size=10g inactive=60m use_temp_path=off;

server {
    listen       80;
    server_name  localhost;

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

    
    location / {
        proxy_cache off;
        proxy_pass http://tomcat;
        proxy_cache_valid 200 304 12h;
        proxy_cache_valid any 10m;
        proxy_cache_key $host$uri$is_args$args;
        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;
    }
  • proxy_cache_path:是配置代理缓存最先配置的。
  • /opt/app/cache:存放缓存的临时文件的。
  • levels=1:2:将目录进行分级,一般建议就是这么写,按照2层的目录进行分级。
  • keys_zone=fe_cow:开辟zone空间的名字,相当于key:
    • 跟location 里面的proxy_cache:fe_cow ; 一样
  • :10m:开辟zone空间的大小,m表示的是兆。
  • max_size=10g:表示控制这个目录(/opt/app/cache)最大是多大。
    • 为了避免不让他无限的增长,导致把系统的磁盘占满。
  • inactive=60m:表示再60分钟之内没有访问该文件,就会被清理掉。
  • use_temp_path=off:用来存放临时文件的.
  • proxy_cache off; 表示已经关闭了 缓存。
  • proxy_cache_valid 200 304 12h; :表示响应头信息是200或者是304的信息时,它的过期时间时12个小时过期。
  • proxy_cache_valid any 10m;:除了200或者304状态的信息, 过期时间时10分钟以后过期。
  • proxy_cache_key h o s t host uri i s a r g s is_args args: 以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;
    • 如果后端服务器返回的状态时500,502,503,504的错误信息的时候,就会跳过后端代理的这台服务器。

5、如何让部分页面不缓存:

  • 语法:

    • Syntax:proxy_no_cache string;
    • Default:—
    • Context:http,server,location
    if ($request_uri ~ ^/(url3|login|register|password\/reset)){  # 请求uri中url3|login|register..... 这些地址的时候,是不需要带缓存的
        set $cookie_nocache 1;  # 打开设置不带缓存
        }
    location / {
        proxy_no_cache  $cookie_nocache $arg_nocache $arg_comment; 
    }
    
    • proxy_no_cache:不设置缓存配置项
    • $cookie_nocache:变量名字

6、大文件分片请求:

  • 再1.9版本以后出现了 对于大文件来说分片请求的功能。

  • 配置语法:

    • Syntax:slice size;
    • Default:slice 0;
    • Context:http,server,location
  • 图解:

    在这里插入图片描述

  • 优势:每个子请求收到的数据都会形成一个独立的文件,一个请求断了,其它请求不受影响。

  • 缺点:当文件很大或者slice很小的时候,可能会导致文件描述符耗尽情况。

猜你喜欢

转载自blog.csdn.net/Fe_cow/article/details/84672361