美文网首页
第13章 Nginx缓存与压缩配置

第13章 Nginx缓存与压缩配置

作者: hubery_zhao | 来源:发表于2023-03-13 09:24 被阅读0次

Nginx的缓存介绍

Nginx 是在网站的所有其他后台服务的最前线,它接收的请求和流量是后台服务的数倍甚至数十倍之多。因此,用好 Nginx 的缓存功能对于大型网站而言至关重要。Nginx 中的缓存功能优势如下:

• 提升所有客户端体验
• 有效降低上游服务器的负载
• 减少上游服务器之间的流量消耗

Nginx 的 Web 缓存服务主要由 proxy_cache 相关指令集和 fastcgi_cache 相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对 FastCGI 的动态程序进行缓存。两者的功能基本上一样。强大的缓存功能也成为了 Nginx 吸引众多用户的重要因素之一

Nginx 中缓存指令

expires 指

Nginx 中的 expires 指令通过控制 HTTP 相应中的" Expires" 和 "Cache-Control" 的头部值,达控制浏览器缓存时间的效果。指令格式:

Syntax: expires [modified] time;
    expires epoch | max |off;
Default: expires off;
Context: http,server,location,if in location

Nginx 中的时间单位有 s(秒), m(分), h(小), d(天)。指令参数说明: •

epoch: 指定"Expires"的值为 1, 即 January,1970,00:00:01 GMT; 
max: 指定"Expires"的值为 31 December2037 23:59:59GMT, "Cache-Control"的值为 10
年; 
• -1:指定"Expires"的值为当前服务器时间-1s,即永远过期;
off:不修改"Expires"和"Cache-Control"的值
• time 中出现@表示具体的时间,比如@18h30m 表示的是下午 6 点半

官方示例:

expires 24h;    # 24小时过期
expires modified +24h;
expires @24h;
expires 0;      # 不缓存,立即过期
expires -1;     # 永不过期
expires epoch;
expires $expires;
expires

proxy 模块中的 cache 相关指令

Nginx 的 proxy 模块中定义了许多和 cache 相关的模块,这是配置 http 请求代理的缓存功能。
通常情况下,我们使用 proxy_cache 指令开启 Nginx 缓存功能,用proxy_cache_path 指令来设置缓存的路径和其他配置。两个指令的用法如下

Syntax: proxy_cache zone | off;
Default: proxy_cache off;
Context: http,server,location

Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default:    —
Context:    http

proxy_cache_path 指令中有较多的参数,部分重要参数说明如下: •

path: 定义缓存存放的位置; • 
levels: 定义缓存路径的目录等级,最多 3 级
use_temp_path:
    on: 使用 proxy_temp_path 定义的目录
    off: • 
keys_zone:
name: 共享内存名
size: 共享内存大小
max_size: 设置最大的缓存文件大小

其余的重要的缓存指令有:

proxy_cache_key: 配置缓存的关键字,格式如下

Syntax: proxy_cache_key string;
Default:    
proxy_cache_key $scheme$proxy_host$request_uri;
Context:    http, server, location

官方示例

roxy_cache_key "$host$request_uri $cookie_user";
proxy_cache_valid: 配置缓存什么样的响应,缓存多长时间。注意,如果只设置了缓存时间,只缓存只针对相应码 200, 301 和 302 的请求 。格式如下:

Syntax: proxy_cache_valid [code ...] time;
Default:    —
Context:    http, server, location

示例

# 代码为200和302的响应设置10分钟的缓存,代码为404的响应设置1分钟的缓存
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

# 如果只指定了缓存时间 , 则仅缓存200、301和302个响应。
proxy_cache_valid 5m;

# 此外,可以指定any参数来缓存任何响应 , 缓存的参数也可以直接在响应头中设置。这比使用指令设置缓存时间具有更高的优先级
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301      1h;
proxy_cache_valid any      1m;

proxy_cache_methods: 对哪种 method 的请求使用缓存返回响

Syntax: proxy_cache_methods GET | HEAD | POST ...;
Default:    proxy_cache_methods GET HEAD;
Context:    http, server, location
This directive appeared in version 0.7.59.

Nginx 中的压缩配置

Nginx 的压缩配置主要是用在与浏览交互中,对网页、css、js 等静态资源进行压缩,通过消耗 cpu 的计算资源来节约大量的带宽,提高传输效率,给用户良好的体验。Nginx 中的 ngx_http_gzip_module 就是专门处理这里压缩功能的模块。其中部分重要指如下: •

gzip: 是否打开 gzip 压

Syntax: gzip  on | off;
Default: gzip off;
Context: http,server,location,if in location

gzip_buffers : 设置压缩所需要的缓存区大小;

Syntax: gzip_buffers number size;
Default: gzip_buffers 32 4k|16 8k;
Context: http,server,location

gzip_comp_level: 设置压缩级别, 从1-9 ,越大压缩率越高,同时消耗CPU资源越来越多;

Syntax: gzip_comp_level level;
Default: gzip_comp_level 1;
Context: http,server,location

gzip_types: 需要压缩的文件格式text/html默认会压缩,不会添加

Syntax: gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http,server,location

gzip_min_length: 压缩文件最小大小

Syntax: gzip_min_length length;
Default: gzip_min_length 20;
Context: http,server,location

一个常见的压缩配置如下:

# 开启gzip压缩
gzip on;

# http的协议版本
gzip_http_version 1.0;

# IE版本1-6不支持gzip压缩,关闭
gzip_disable 'MSIE[1-6]';

# 需要压缩的文件格式
gzip_types text/css text/javascript application/javascript image/jpeg ...;

# 设置4个8k的内存作为压缩结果留缓存
gzip_buffers 4 8k;

# 压缩文件最小大小
gzip_min_length 1k;

# 压缩级别1-9
gzip_comp_level 9;

# 给响应头加 vary,告知客户端能否缓存
gzip_vary on;

# 反向代理时使用
gzip_proxied off;

注意: gzip 的开启需适应特定的场景,比如大文件和图片的传输就不是和开启gzip 功能,压缩效果不明显的同时还白白耗费系统的资源,所以使用时需要慎重考虑

案例

expires

准备 nginx.conf,中间简单配置几条 expires 指令

...
http {
    server {
        listen 8000;
        location / {
            default_type text/plain;
            expires 10m;
            # expires -1h;
            return 200 '8000,server\n';
        }
    }
}
...

下面观察请求结果

[root@centos-13 conf]# curl http://192.168.232.13:8000 -I
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Thu, 17 Nov 2022 10:30:00 GMT
Content-Type: text/plain
Content-Length: 12
Connection: keep-alive
Expires: Thu, 17 Nov 2022 10:40:00 GMT
Cache-Control: max-age=600

使用expires -1h 配置, -1h 表示环境一个小时前过期,所以返回cache-contril的值为no-cache

…
        server {
                listen 8000;
                location / {
                        default_type text/plain;
                        # expires 10m;
                        expires -1h;
                        return 200 '8000,server\n';
                }
        }
…

执行如下:

[root@centos-13 conf]# curl  http://192.168.232.13:8000 -I
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Thu, 17 Nov 2022 10:32:56 GMT
Content-Type: text/plain
Content-Length: 12
Connection: keep-alive
Expires: Thu, 17 Nov 2022 09:32:56 GMT
Cache-Control: no-cache

proxy_cache 缓存实验

准备好 proxy_cache 缓存相关的配置:

…
http {

        server {
                listen 8000;
                location / {
                        default_type text/plain;
                        return 200 '8000,server\n';
                }

        }

        server {
                listen 8001;
                location / {
                        default_type text/plain;
                        return 200 '8001,server\n';
                }
        }

        server {
                listen 8002;
                location / {
                        default_type text/plain;
                        return 200 '8002,server\n';
                }
        }

        # 定义上游服务器
        upstream  backends {
                server 127.0.0.1:8000;
                server 127.0.0.1:8001;
                server 127.0.0.1:8002;
        }

        # proxy_cache_path 指令
        proxy_cache_path /root/test/cache levels=1:2 keys_zone=nginx_cache:10m max_size=10g;

        server {
                listen 80;
                location / {
                        proxy_pass http://backends;
                        proxy_cache nginx_cache;
                        # 状态码 为 200 和 301 的缓存1 分钟
                        proxy_cache_valid 200 301 1m;
                        # 其余的缓存 10分钟
                        proxy_cache_valid any 10m;
                        # response 响应的头信息中定义缓存的状态(有没有命中)
                        proxy_cache_key "$host$uri$is_args$args";
                        expires 1d;
                        proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
                        proxy_no_cache $http_pragma $http_authorization;
                        # add_header 响应添加缓冲命中结果
                        add_header Nginx-cache "$upstream_cache_status";
                }
        }
}
…

第一次请求,转到了8000端口,然后缓存之后,在缓存有效时间内都是转到这个端口 , 状态是200 301的缓存时间1分钟。

[root@centos-13 conf]# curl  http://192.168.232.13
8000,server
[root@centos-13 conf]# curl  http://192.168.232.13
8000,server
[root@centos-13 conf]# curl  http://192.168.232.13
8000,server
[root@centos-13 conf]# curl  http://192.168.232.13
8000,server

缓存失效之后,在此转发可能到8000-8002中任何一个端口 ,并且在这次有效缓存时间内也只转发到这个端口。

[root@centos-13 conf]# curl  http://192.168.232.13
8001,server
[root@centos-13 conf]# curl  http://192.168.232.13
8001,server
[root@centos-13 conf]# curl  http://192.168.232.13
8001,server
[root@centos-13 conf]# curl  http://192.168.232.13
8001,server

查看access.log日志

127.0.0.1 - - [17/Nov/2022:19:11:52 +0800] "GET / HTTP/1.0" 200 12 "-" "curl/7.29.0"
192.168.232.15 - - [17/Nov/2022:19:11:52 +0800] "GET / HTTP/1.1" 200 12 "-" "curl/7.29.0"
192.168.232.15 - - [17/Nov/2022:19:11:52 +0800] "GET / HTTP/1.1" 200 12 "-" "curl/7.29.0"
192.168.232.15 - - [17/Nov/2022:19:11:53 +0800] "GET / HTTP/1.1" 200 12 "-" "curl/7.29.0"
192.168.232.15 - - [17/Nov/2022:19:11:53 +0800] "GET / HTTP/1.1" 200 12 "-" "curl/7.29.0"

192.168.232.16 - - [17/Nov/2022:19:11:57 +0800] "GET / HTTP/1.1" 200 12 "-" "curl/7.29.0"
192.168.232.16 - - [17/Nov/2022:19:11:58 +0800] "GET / HTTP/1.1" 200 12 "-" "curl/7.29.0"
192.168.232.16 - - [17/Nov/2022:19:11:58 +0800] "GET / HTTP/1.1" 200 12 "-" "curl/7.29.0"
192.168.232.16 - - [17/Nov/2022:19:11:59 +0800] "GET / HTTP/1.1" 200 12 "-" "curl/7.29.0"

相关文章

网友评论

      本文标题:第13章 Nginx缓存与压缩配置

      本文链接:https://www.haomeiwen.com/subject/gelgkdtx.html