nginx 缓存和缓冲
关于缓存的理解
缓存是一个性能优化的机制,需要考虑并平衡性能
、设备可用性
、内容可用性
三个方面。
性能
:优化业务,缩短响应时间。命中缓存,让访问者更快看到响应;减少后端服务压力,让后台服务去处理真正有价值的逻辑;设备可用性
:网关(缓存设备)的存储空间是有限的,需要保证缓存最活跃的内容。越活跃缓存的收益越高。所以要能够及时删除不活跃的缓存;缓存数据如果超过30分钟没有命中,那么会被删除掉,这个称为缓存老化时间;缓存刷新时间
: 内容有可能被更新,内容更新了之后希望在指定时间内对用户生效。所以,缓存需要有过期时间,并在过期时间之后,去后端请求新鲜的内容。
在 nginx 中如何配置,以及各配置的作用和含义,待补充。。。
关于nginx代理缓冲
nginx 将 server 端的响应读取下来缓存在本地内存或磁盘中,再以合适的速度发送给客户端。
为什么要有代理缓冲?
在互联网中,nginx 通常和 server 在同区机房,意味着 nginx 和 server 之间的网络质量好,nginx 可以很快从 server 端读取响应。而客户端往往是用户网络,到 nginx 机房网络质量不可控,一般要远远低于 nginx 到 server 的网速。
这会导致 nginx 只能以较慢的速度将响应传给客户端,而后端 server 也只能以较慢速度传递响应给 nginx,造成一次请求连接耗时过长。
在高并发的压力下,后端 server 可能会出现大量的连接积压,最终会拖垮 server 端。
代理缓冲优缺点
缓冲的优点
nginx 可以用较快速度尽可能将响应体读取并缓冲到本地内存或磁盘中,然后根据客户端网络质量以合适的网速将响应传递给客户端。
既解决了 server 端连接过多的问题,也保证了能持续稳定的向客户端传递响应。
缓冲的缺点
1)开启代理缓冲会消耗 nginx 服务器的内存,如果请求过多会导致 nginx 内存消耗过大,所以缓冲区大小设置需要根据实际的服务器配置和请求量来进行评估。
2)响应过大的情况下,设置的缓冲区无法存下整个响应体,nginx 会将剩余的内容写入磁盘临时文件中。在请求量较大时,可能会导致 nginx 磁盘 IO 过高。
3)客户端网络质量很好的情况下,比如客户端到 nginx 也是同机房内,这时关闭代理缓冲直接将响应实时转发给客户端效率更高。
代理缓冲配置参数
proxy_buffering
1 | # 默认值:on |
用于控制开启或关闭代理缓冲区。开启时,nginx 会尽快从 server 读取响应并缓存在分配的内存缓冲区中。代理缓冲区的大小由 proxy_buffer_size
和 proxy_buffers
参数指定。
proxy_buffer_size
1 | # 默认值:4k | 8k |
用于设置从 server 端读取初始部分响应所使用的缓存大小,这部分通常包含一个小的响应头部。
通常该缓冲区大小设置为一个内存页的大小,具体是 4k 或 8k,取决于服务器平台。可以把它设置更小,但没必要设置过大,因为只是用于缓冲初始部分的响应。
需要注意,proxy_buffer_size
参数并不受 proxy_buffering
开启或关闭的影响,它始终都是生效的。
proxy_buffers
1 | # 默认值:8 4k|8k |
用于设置从 server 端读取响应所使用的缓冲区个数和大小,通常默认情况下,单个缓冲区大小设置为一个内存页的大小,如 4k 或 8k。
注意,这里设置的缓冲区大小是针对每个请求连接而言的,每一个连接都会分配 N*Size
大小的缓冲区。要根据服务器配置和请求量评估缓冲区配置大小,避免出现 nginx 将内存耗尽的情况。
proxy_busy_buffers_size
1 | # 默认值:8k|16k |
用于设置当还未从 server 端读取到完整响应时,允许开始给客户端发送响应的缓冲区大小。
在指定大小的缓冲区进入 busy 状态后将无法再写入,而剩余的缓冲区可以同时继续从 server 端读取响应,或者将响应写入磁盘临时文件。
通常该参数值设置为 proxy_buffer_size
和 proxy_buffers
中单个 buffer 之和,也就是单个内存页的 2 倍。
缓冲写入临时磁盘
当响应大小超过内存缓冲区时,一部分响应体可以保存在磁盘临时的文件中。磁盘临时文件的大小由 proxy_max_temp_file_size
和 proxy_temp_file_write_size
参数指定。
proxy_max_temp_file_size
1 | proxy_max_temp_file_size 1024m; |
该参数用于设置磁盘临时文件的最大size。当server端返回的整个响应超出proxy_buffering和proxy_buffers设置的内存缓冲区大小时,剩余的响应体可以保存在一个磁盘临时文件中。proxy_max_temp_file_size指定了该临时文件的最大大小。
而一次能写入磁盘临时文件的数据大小由 proxy_temp_file_write_size 参数指定。注意, proxy_max_temp_file_size 参数设置为0可以禁止将响应保存到磁盘临时文件中。
proxy_temp_file_write_size
1 | proxy_temp_file_write_size 8k; |
该参数用于设置每次写入磁盘临时文件的大小。
proxy_temp_path
用于指定代理缓存临时文件的存储目录。
- 这个机制至关重要,将代理缓存临时文件存储在磁盘而不是内存中,可以使 nginx 处理大量响应而不会消耗过多的内存资源。这在处理高流量负载或代理大文件时尤为重要。
- 通过使用临时文件,nginx 可以开始向客户端发送响应,同时从后端服务器接收响应。这种异步行为可以提高整体性能并减少延迟。
- 通过为临时文件指定专用目录,可以确保它们与服务器上的其他文件分开存储。这可以防止临时文件填满磁盘并导致磁盘空间问题。
磁盘异常对nginx影响
对缓存功能的影响
条件:开启proxy_buffering,开启proxy_cache,设置独立缓存磁盘
磁盘满了
:缓存无法写入磁盘,但服务可以访问,也不影响访问速度;磁盘只读
:缓存无法写入磁盘,但服务可以访问,也不影响访问速度;磁盘坏道
:无法模拟环境,暂未测试;
对缓冲区功能影响
条件:开启proxy_buffering,开启proxy_cache,设置独立缓冲磁盘
磁盘满了
:服务访问不正常,缓存和缓冲区无法写入文件;磁盘只读
:服务访问不正常,缓存和缓冲区无法写入文件;磁盘坏道
:无法模拟环境,暂未测试;
总结
缓存和缓冲,一切都是为了性能优化,同时考虑系统和服务可用性的平衡。