分布式 - 服务器Nginx:一小时入门系列之代理缓冲与缓存

官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html

1. 代理缓冲 proxy_buffer

代理缓冲用于临时存储从后端服务器返回的响应数据。通过使用代理缓冲,Nginx可以在接收完整的响应后再将其发送给客户端,从而提高性能和效率。

① 客户端往往是用户网络,情况复杂,可能出现网络不稳定,速度较慢的情况。而nginx到后端server一般处于同一个机房或者区域,网速稳定且速度极快。

② 如果禁用了缓冲,则在客户端从代理服务器接收响应时,响应将同步发送到客户端。对于需要尽快开始接收响应的快速交互式客户端,此行为可能是可取的。这就会带来一个问题:因为客户端到 nginx 的网速过慢,导致 nginx 只能以一个较慢的速度将响应传给客户端;进而导致后端server也只能以同样较慢的速度传递响应给nginx,造成一次请求连接耗时过长。

③ 启用缓冲后,nginx先将后端的请求响应放入缓冲区中,等到整个响应完成后,再发给客户端。

开启代理缓冲后,nginx 可以用较快的速度尽可能将响应体读取并缓冲到本地内存或磁盘中,同时根据客户端的网络质量以合适的网速将响应传递给客户端。这样既解决了server端连接过多的问题,也保证了能持续稳定的像客户端传递响应。

1. proxy_buffering 指令

当 proxy_buffering 设置为 off 时,Nginx 将禁用代理缓冲。这意味着当 Nginx 作为代理服务器转发请求时,它将立即将响应从上游服务器传递给客户端,而不会先将响应缓存到 Nginx 服务器上。

使用 proxy_buffering 启用和禁用缓冲,nginx默认为 on 启用缓冲,若要关闭,设置为 off 。

nginx 复制代码
proxy_buffering off;

禁用代理缓冲可以提高实时性和响应速度,特别适用于实时通信、流媒体或需要立即将数据传递给客户端的应用程序。然而,禁用代理缓冲也可能增加上游服务器的负载,因为它们需要即时响应每个请求。

禁用代理缓冲可以提高实时性和响应速度,特别适用于实时通信、流媒体或需要立即将数据传递给客户端的应用程序。然而,禁用代理缓冲也可能增加上游服务器的负载,因为它们需要即时响应每个请求。

2. proxy_buffers 与 proxy_buffer_size 指令

proxy_buffers 指令用于设置代理服务器缓存响应的缓冲区大小和数量。它的语法如下:

nginx 复制代码
proxy_buffers number size;

其中,number 表示缓冲区的数量,size 表示每个缓冲区的大小。例如,如果设置为 proxy_buffers 4 32k; 则会为每个客户端连接分配 4 个缓冲区,每个缓冲区的大小为 32KB。

通常情况下,来自后端服务器响应的第一部分存储在单独的缓冲区中,这个缓冲区存储的是相对较小的响应头部信息,大小通过 proxy_buffer_size 指令进行设置 ,建议将 proxy_buffer_size 设置为小于默认值。默认情况下,proxy_buffer_size 的大小为4k,但可以根据实际需求进行调整。

nginx 复制代码
location / {
    proxy_buffers 16 4k;
    proxy_buffer_size 2k;
    proxy_pass http://localhost:8088;
}

2. 代理缓存

启用缓存后,nginx将响应保存在磁盘中,返回给客户端的数据首先从缓存中获取,这样子相同的请求不用每次都发送给后端服务器,减少到后端请求的数量。

1. proxy_cache_path 指令

proxy_cache_path 指令用于指定缓存文件存储的路径、缓存文件的格式、缓存文件的最大大小等参数。以下是 proxy_cache_path 的常用参数:

  • path: 缓存文件存储的路径。
  • levels: 缓存文件存储的目录层数。
  • keys_zone: 缓存文件的键值对存储区域。
  • inactive: 缓存文件的过期时间,单位为秒。
  • max_size: 缓存文件的最大大小。
  • use_temp_path: 是否使用临时文件夹存储缓存文件。

例如,以下配置将缓存文件存储在 /var/cache/nginx 目录下,缓存文件的键值对存储区域为 my_cache,缓存文件的过期时间为 10 分钟,缓存文件的最大大小为 1GB:

java 复制代码
proxy_cache_path /var/cache/nginx keys_zone=my_cache:10m inactive=10m max_size=1g;

在配置反向代理时,可以使用 proxy_cache 指令启用缓存,例如:

nginx 复制代码
location / {
    proxy_pass http://backend;
    proxy_cache my_cache;
    proxy_cache_valid 200 10m;
}

以上配置将启用缓存,并设置缓存文件的过期时间为 10 分钟。当 Nginx 收到客户端请求时,如果缓存中存在对应的响应,Nginx 将直接返回缓存中的响应,而不是向后端服务器发起请求。

2. proxy_cache_valid 指令

proxy_cache_valid 指令用于设置缓存的有效期。

nginx 复制代码
proxy_cache_valid [code ...] time;

其中,code是HTTP响应状态码,可以是一个或多个,用空格分隔。如果省略code参数,则表示适用于所有状态码。time是缓存的有效期,可以是一个时间段,也可以是一个时间戳。

如果要设置不同状态码的不同缓存时间,可以使用多个proxy_cache_valid指令,例如:

nginx 复制代码
proxy_cache_valid 200 10m;
proxy_cache_valid 404 1m;

这样就表示缓存200状态码的响应10分钟,缓存404状态码的响应1分钟。

3. proxy_cache_min_uses 指令

可以使用 proxy_cache_min_uses 设置相同的key的请求,访问次数超过指定数量才会被缓存。

proxy_cache_min_uses 指令用于设置在缓存服务器中缓存一个响应所需的最小请求数。当一个请求被代理到后端服务器时,如果该请求的响应已经被缓存,Nginx 会将缓存的响应返回给客户端,而不是将请求转发到后端服务器。proxy_cache_min_uses 指令可以控制在缓存服务器中缓存一个响应所需的最小请求数,以避免缓存不必要的响应。当一个响应被缓存时,Nginx 会记录该响应被缓存的时间,并在一定时间后将其从缓存中删除。如果一个响应被缓存的时间太短,那么它可能会被频繁地从缓存中删除和重新缓存,这会浪费缓存服务器的资源。因此,通过设置 proxy_cache_min_uses 指令,可以确保只有经过多次访问的响应才会被缓存,从而提高缓存服务器的效率。

nginx 复制代码
proxy_cache_min_uses 5;

默认情况下,响应无限期地保留在缓存中。仅当缓存超过最大配置大小时,按照时间删除最旧的数据。

3. 应用

nginx 复制代码
proxy_cache_path /var/cache/nginx/data keys_zone=mycache:10m;

server {
    listen 8001;
    server_name ruoyi.localhost;
    
    location / {
        #设置buffer
        proxy_buffers 16 4k;
        proxy_buffer_size 2k;
        proxy_pass http://localhost:8088;        
    }

    location ~ \.(js|css|png|jpg|gif|ico) {
        #设置cache
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any 5m;
        proxy_pass http://localhost:8088;  
    }

    location = /html/ie.html {
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any 5m;
        proxy_pass http://localhost:8088;  
    }

    location ^~ /fonts/ {
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404      1m;
        proxy_cache_valid any 5m;
        proxy_pass http://localhost:8088;  
    }
}
相关推荐
UP_Continue1 天前
Linux--进程优先级和进程切换
linux·运维·服务器
Maggie_ssss_supp1 天前
Linux-MGR单主集群部署
linux·运维·服务器
独隅1 天前
本地大模型训练与 API 服务部署全栈方案:基于 Ubuntu 22.04 LTS 的端到端实现指南
服务器·python·语言模型
dustcell.1 天前
高级课前复习2--RHCSA
linux·运维·服务器
Anthony_2311 天前
五、交换技术与VLAN
服务器·网络·网络协议·http·https·udp·信息与通信
fanruitian1 天前
k8s 更新镜像
java·服务器·kubernetes
fanruitian1 天前
k8s 创建service 暴漏集群ip
服务器·网络·kubernetes
Source.Liu1 天前
【办公平台】在 Ubuntu 上部署 Synapse Matrix 服务器(本地网络版)
服务器·ubuntu
LYOBOYI1231 天前
qml程序运行逻辑
java·服务器·数据库
袁煦丞 cpolar内网穿透实验室1 天前
mysql_exporter+cpolar远程监控 MySQL 不卡壳!cpolar 内网穿透实验室第 712 个成功挑战
服务器·数据库·mysql·远程工作·内网穿透·cpolar