5. Nginx极速版-缓冲和缓存
缓冲(buffer)
缓冲一般放在内存中,如果不适合放入内存(比如超过了指定大小),则会将响应写入磁盘临时文件中。
启用缓冲后,nginx 先将后端的请求 (response)放入缓冲区中,等到整个响应完成后,再发给客户端。
开启代理缓冲后,ngix 可以用较快的速度尽可能将响应体读取并缓冲到本地内存或磁盘中,然后同时根据客户端的网络质量以合适的网速将响应传递给客户端。
这样既解决了客户端网络不畅通导致服务端一直占用连接,导致的 server 端连接过多的问题,也保证了能持续稳定的像客户端传递响应。(这一次的请求缓冲到了本地内存中,然后一点一点发给客户端就可以了)
使用 proxy_buffering 启用和禁用缓冲,nginx 默认为 on 启用缓冲,若要关闭,设置为 off。
proxy_buffers 指令设置每个连接读取响应的缓冲区的大小和数量。默认情况下,缓冲区大小等于一个内存页,4 K 或 8 K, 具体取决于操作系统。来自后端服务器响应的第一部分存储在单独的缓冲区中,其大小通过 proxy_buffer_size 指令进行设置,此部分通常是相对较小的响应 headers, 通常将其设置成小于默认值。
如果整个响应不适合存到内存里,则将其中的一部分保存到磁盘上的临时文件中。
proxy_max_temp_file_size:设置临时文件的最大值。
proxy_temp_file_write_size:设置一次写入临时文件的大小。
缓存
启用缓存后,nginx 将响应保存在磁盘中,返回给客户端的数据首先从缓存中获取,这样子相同的请求不用每次都发送给后端服务器,减少到后端请求的数量。
启用缓存,需要在 http 上下文中使用 proxy_cache_path 指令,定义缓存的本地文件目录,名称和大小。
缓存区可以被多个 server 共享,使用 proxy_cache 指定使用哪个缓存区。
案例
# 使用前要先创建目录
proxy_cache_path /var/cache/nginx/static keys_zone=static:100m;
server {
listen 8112;
server_name talebook_proxy2;
location / {
# Nginx 的主机地址
proxy_set_header Host $http_host;
# 用户的真是IP 如果不配置这个,用户的真实IP将会被忽略,拿到的就是Nginx的IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffers 16 4k;
proxy_pass http://localhost:8120;
}
location ~ \.(js|css|png|jpg|gif|ico) {
# 指定使用那个缓冲区
proxy_cache static;
# 响应码为200和302的缓存10分钟
proxy_cache_valid 200 302 10m;
# 响应码为404的缓存1分钟
proxy_cache_valid 404 1m;
# 其他的缓存5分钟
proxy_cache_valid any 5m;
proxy_pass http://localhost:8120;
}
}
其他配置
load_module /usr/lib/nginx/modules/ngx_stream_module.so;
worker_processes auto;
# 需要配置成root或者nginx用户,否则worker进程默认为nobody,权限不够无法写入缓存
user root;
events {
worker_connections 1024;
accept_mutex on;
}
http {
include mime.types;
client_max_body_size 20000m;
server_names_hash_bucket_size 128;
default_type application/octet-stream;
proxy_cache_path /home/nginx_cache keys_zone=cache_one:200m;
access_log /home/nginxWebUI/log/nginx/access.log custom_format;
error_log/home/nginxWebUI/log/nginx/error.log;
include conf.d/*.conf;
}