Nginx服务器作反向代理时的缓存配置要点解析

 更新时间:2016年04月12日 09:24:07   作者:lmdkfs  
这篇文章主要介绍了Nginx服务器作反向代理时的缓存配置要点解析,需要的朋友可以参考下

这里给出示例,并详解。

http {
[...]
[...]
 
proxy_cache_path /data/nginx/cache/one levels=1:2  keys_zone=one:10m max_size=10g;
proxy_cache_key "$host$request_uri";
 
server {
  server_name www.jb51.net jb51.net;
  root /home/www.jb51.net/web;
  index index.php index.html index.htm;
  location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host "www.jb51.net";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #开启反向代理缓存,并使用zone name为one的缓存。
    proxy_cache one;
    #设置状态码为200 302过期时间为10分钟
    proxy_cache_valid 200 302 10m;
    #设置状态码404的过期时间为1分钟
    proxy_cache_valid 404   1m;
  }
  #清除缓存
  location ~ /purge(/.*) {
    #允许的IP
    allow 127.0.0.1;
    deny all;
    proxy_cache_purge one $host$1$is_args$args;
  }
}
 
}

反向代理的缓存主要涉及以下几个命令:

proxy_cache_path proxy_cache_key proxy_cache proxy_cache_valid。
1.proxy_cache_path

这个是设置缓存的目录,语法如下:

复制代码 代码如下:

proxy_cache_path path [ levels = levels ] keys_zone = name : size [ inactive = time ] [ max_size = size ] [ loader_files = number ] [ loader_sleep = time ] [ loader_threshold = time ]


可放置的上下文:
http
参数解释:
[ levels = levels ]:
设置缓存目录层数,如levels=1:2,表示创建两层目录缓存,最多创建三层。第一层目录名取proxy_cache_key md5的最后一个字符,第二层目录名取倒数2-3字符,如:
proxy_cache_key md5为b7f54b2df7773722d382f4809d65029c,则:
levels=1:2为/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
levels=1:2:3为/data/nginx/cache/c/29/650/b7f54b2df7773722d382f4809d65029c
2.keys_zone = name : size:
定义缓存区域名称及大小,缓存名称用于proxy_cache指令设置缓存放置在哪,如proxy_cache one,则把缓存放在zone名称为one的缓存区,即proxy_cache_path指定的具体位置。
3.proxy_cache_key
这个指令是设置以什么参数md5得到缓存的文件名,默认为$scheme$proxy_host$request_uri,即以协议、主机名、请求uri(包含参数)作md5得出缓存的文件名。
proxy_cache_key与下面的清缓存功能(purge cache)有很大关系。
可放置在上下文,http server location
4.proxy_cache
反向代理缓存设置指令,语法proxy_cache zone | off,默认为off。上下文:http server location。
可以放到指定location,这样匹配此location的url才被缓存。
5.proxy_cache_valid
设置指定状态码的缓存时间,语法proxy_cache_valid [ code …] time。
另外,清缓存需要安装插件ngx_cache_purge,安装方法如下:

cd /tmp
wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz
tar xzf ngx_cache_purge-2.1.tar.gz
cd /tmp
wget http://nginx.org/download/nginx-1.4.2.tar.gz
tar xzf nginx-1.4.2.tar.gz
cd nginx-1.4.2
./configure --prefix=/usr/local/nginx --add-module=/tmp/ngx_cache_purge-2.1
make && make install

缓存过期时间
在配置的时候,有如下三个地方可以设置缓存过期时间:

1.inactive=1d
2.proxy_cache_valid 200 304 1h
3.expires 10m
其实解释起来很简单:

inactive=1d 是指多久未访问以后清除缓存
proxy_cache_valid 200 304 1h 是指距离缓存产生时间多久以后清除缓存
expires 10m 这个不是控制服务器端的,而是指在Http Response header里指定的过期时间,是给客户端看的。
temp的问题
Nginx进行反代的时候,遇到超出文件大小 proxy_buffer_size 的时候,是一次性把文件都加载到Temp目录,然后再发送给用户。

如果设置了 proxy_buffering off 则不会加载到Temp目录,而是同步的从上游进行加载。

可以通过设置 proxy_max_temp_file_size 参数来设置最大可以缓存的文件大小。

206 和 Byte Range 的问题
Byte Range允许客户端向服务器请求一部分文件,而不是整个文件。大部分支持多线程下载和断点下载的软件都是用的这个功能。这个时候服务器返回的Http Code是206 Partial Requests.

但是Nginx做反代的时候,如果没有好好的设置,这个功能可能会引来Dos攻击。

因为默认做反代的时候,Nginx向后端服务器请求的时候是不会把 Range 参数加上的,而是会去请求整个文件,比方说有一个1G的文件,每次请求1M,Nginx会在每次请求的时候去后端请求一个完整的1G文件,然后取出其中的1M发给客户端,这个时候中间的流量会暴增,导致整个服务器宕机。今天因为这个问题导致我检查了很久。

解决方案也很简单,把 Range 加到Header里就行了。

proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_no_cache $http_range $http_if_range;

相关文章

  • Nginx反向代理出现502 Bad Gateway问题解决

    Nginx反向代理出现502 Bad Gateway问题解决

    在配置Nginx反向代理时遇到502 Bad Gateway错误,经过排查发现是SSL握手问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • Nginx的nginx.conf配置文件中文注释说明

    Nginx的nginx.conf配置文件中文注释说明

    这篇文章主要介绍了Nginx的nginx.conf配置文件中文注释说明,本文是个人注释版,在生产环境中经常使用,需要的朋友可以参考下
    2014-12-12
  • nginx expires控制页面缓存

    nginx expires控制页面缓存

    expires 指令可以控制 HTTP 应答中的“Expires ”和“ Cache-Control ”的头标(起到控制页面缓存的作用)
    2013-01-01
  • Nginx跨域访问场景配置和防盗链详解

    Nginx跨域访问场景配置和防盗链详解

    这篇文章主要介绍了Nginx跨域访问场景配置和防盗链详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Nginx负载均衡配置简单配置方法

    Nginx负载均衡配置简单配置方法

    Nginx作为负载均衡服务器,用户请求先到达nginx,再由nginx根据负载配置将请求转发至不同的Web服务器。下面通过本文给大家分享Nginx负载均衡配置简单配置方法,需要的的朋友参考下吧
    2017-08-08
  • 阿里云国际版使用Nginx作为HTTPS转发代理服务器的处理方法

    阿里云国际版使用Nginx作为HTTPS转发代理服务器的处理方法

    本文介绍了使用NGINX作为HTTPS流量转发代理的两种方法。它总结了NGINX使用HTTP CONNECT隧道和NGINX流充当HTTPS转发代理的解决方案的原则,环境构建要求,应用场景和关键问题
    2022-05-05
  • keepalived监控nginx进程的实现示例

    keepalived监控nginx进程的实现示例

    本文主要介绍了keepalived监控nginx进程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • win10安装配置nginx的过程

    win10安装配置nginx的过程

    这篇文章主要介绍了win10安装配置nginx的过程,帮助大家更好的理解和使用nginx服务器,感兴趣的朋友可以了解下
    2020-10-10
  • nginx多location配置实例代码

    nginx多location配置实例代码

    公司测试环境使用nginx部署多个前端项目,下面这篇文章主要给大家介绍了关于nginx多location配置的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • Nginx中配置WebSocket代理的详细步骤

    Nginx中配置WebSocket代理的详细步骤

    Nginx 可以配置为 WebSocket 代理,将 WebSocket 连接从客户端转发到后端服务器,以下是如何在 Nginx 中配置 WebSocket 代理的详细步骤和示例配置,需要的朋友可以参考下
    2025-02-02

最新评论