缓冲(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;
}