这里给出示例,并详解。
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
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;