9 Nginx的Web缓存服务

Nginx的缓存服务

Nginx版本从0.7.48开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当做Key,用Md5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录内。

Nginx Web 缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令手动清除缓存;但是我们可以通过Nginx的模块ngx_cache_purge清除指定URL的缓存。

 

proxy_cache相关指令

1.proxy_cache  

语法:proxy_cache zone_name;

使用环境:http,location,server;

该指令主要是设置哪个缓存区将被使用,zone_name的值是proxy_cache_path指令创建的缓存区名称。

 

2.proxy_cache_path

语法:proxy_cache_path path [levels=num] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];

使用环境:http;

该指令用于设置缓存文件的存放路径,示例如下:

proxy_cache_path /data0/proxy_cache_dir levels=1:2  keys_zone=cache_one:500M  inactive=1d  max_size=30g;

注意:该指令只能在Http内配置,levels指定了该缓存空间有两层hash目录,第一层目录为1个字母,第二层目录为2个字母,保存文件类似于/data0/proxy_cache_dir/c/22/filename; keys_zone为这个缓存区起名为zone_name,500m指代缓存空间为500MB; inactive=1d 代表如果缓存文件一天内没有被访问,则删除; max_size=30g代表硬盘缓存最大为30G;

 

3.proxy_cache_methods

语法:proxy_cache_methods [GET HEAD POST]

默认值:proxy_cache_methods GET HEAD;

使用环境:http,location,server;

该指令用于设置缓存哪些Http方法,默认缓存HTTP GET/HEAD方法,不缓存HTTP POST方法。

 

4.proxy_cache_min_uses

语法:proxy_cache_min_uses the_number

默认值:proxy_cache_min_uses 1;

使用环境:http,server,location

该指令用于设置缓存的最小使用次数,默认值是1。

 

5.proxy_cache_valid

语法:proxy_cache_valid reply_code [reply_code ... ] time

使用环境:http,server,location

该指令用于对不同返回状态码的URL设置不同的缓存时间,例如:

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404  1m;

设置202 302状态URL缓存10分钟,404状态的URL缓存1分钟。

注意:如果不指定状态码,直接指定缓存时间,则只有200,301,302状态码会进行缓存。

proxy_cache_valid 200 301 302 10m;

proxy_cache_valid any  1m;

对200,301,302状态码缓存10分钟,其他的状态码全部缓存1分钟。

 

6.proxy_cache_key

用法:proxy_cache_key line;

使用环境:http,server,location

该指令用来设置Web缓存的Key值,Nginx根据Key值MD5缓存。一般根据$host(域名),$request_uri(请求的路径)等变量组合成proxy_cache_key。例如:

proxy_cache_key "$host:$server_port$uri$is_args$args";

 

 

Proxy_cache完整示例

1.首先将ngx_cache_purge模块编译安装到Nginx中,用来清除指定URL缓存。

Shell>wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz 

Shell>tar -xvzf ngx_cache_purge-1.0.tar.gz

Shell>cd nginx-1.0

Shell>./configure --user=www --group=www --add-module=../ngx_cache_purge-1.0  --prefix=/usr/local/nginx  --with-http_stub_status_module --with-http_ssl_module

Shell>make && make install

 

 2.在同一个分区下创建两个缓存目录,分别供proxy_temp_path,proxy_cache_path指令设置缓存路径。

Shell>mkdir -p /data0/proxy_temp_path

Shell>mkdir -p /data0/proxy_cache_path

注:两个指定的缓存路径必须为同一磁盘分区,不能跨分区

 

3.修改配置文件(nginx.conf):对扩展名为gif,jpg,png,js,css的文件开启web缓存,其他文件不缓存,代码如下:

http

{

......以上省略许多配置

 

proxy_temp_path   /data0/proxy_temp_path ;

proxy_cache_path /data0/proxy_cache_path levels=1:2 keys_zone=cache_one:200m  inactive=1d  max_size=30g ;

 

upstream my_server_pool

{

server 192.168.1.2:80 weight=1 max_fails=2 fail_timeout=30s;

server 192.168.1.3:80 weight=1 max_fails=2 fail_timeout=30s;

server 192.168.1.4:80 weight=1 max_fails=2 fail_timeout=30s;

}

 

server

{

listen 80;

server_name www.xiaozhe.com;

 

location / 

{

#这里我们做了负载均衡

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_pass http://my_server_pool;

}

 

location ~  .*\.(gif|jpg|png|js|css)$

{

#使用Web缓存区cache_one

proxy_cache cache_one;

 

#对不同的状态码设置不同的缓存时间

proxy_cache_valid 200 304 12h;

proxy_cache_valid 301 302 1m;

proxy_cache_valid any 1m;

 

#设置web缓存的Key值,这里根据域名,URI,参数组合成Key

proxy_cache_key $host$uri$is_args$args;

 

#反向代理,访问后端服务器

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_pass http://my_server_pool;

}

 

#用于清除缓存,假设一个URL为http://www.xiaozhe.com/test.gif,我们可以通过访问http://www.xiaozhe.com/purge/test.gif清除缓存。

location ~  /purge(/.*)

{

#设置允许指定的IP或IP段才可以清除缓存

allow  127.0.0.1;

allow 192.168.0.0/16;

deny all;

proxy_cache_purge cache_one $host$1$is_args$args;

}

 

access_log off;

}

}

  

 

 

Fastcgi_cache相关指令

1.fastcgi_cache

语法:fastcgi_cache zone_name;

默认值:off

使用环境:http,server,location

该指令用于设置哪个缓存区将被使用,zone_name的值为fastcgi_cache_path指令创建的缓存名称。

 

2.fastcgi_cache_path

语法:fastcgi_cache_path path [levels=num] keys_zone=zone_name:zone_size  [inactive=time]  [max_size=size] ;

使用环境:http

该指令只能在http标签内,作用语法什么的都和上面的proxy_cache_path 一样。

 

3.fastcgi_cache_methods

语法:fastcgi_cache_methods [GET HEAD POST ];

默认值:fastcgi_cache_methods GET HEAD ;

使用环境:http,server,location

该指令用于设置缓存哪些HTTP方法,默认缓存HTTP GET/HEAD方法。

 

4.fastcgi_cache_min_uses

语法:fastcgi_cache_min_uses the_number;

默认值:fastcgi_cache_min_uses 1;

使用环境:http,server,location

该指令用于设置缓存最小使用次数

 

5.fastcgi_cache_valid

语法同:proxy_cache_valid

 

6.fastcgi_cache_key

语法同:proxy_cache_key

 

 

Fastcgi_cache完整示例

 1.在同一个分区下创建两个缓存目录,分别供fastcgi_temp_path,fastcgi_cache_path指令设置缓存路径。

Shell>mkdir -p /data0/fastcgi_temp_path

Shell>mkdir -p /data0/fastcgi_cache_path

注:两个指定的缓存路径必须为同一磁盘分区,不能跨分区

 

2.修改配置文件(nginx.conf)开启web缓存,代码如下:

http

{

......以上省略许多配置

 

fastcgi_temp_path   /data0/fastcgi_temp_path ;

fastcgi_cache_path /data0/fastcgi_cache_path levels=1:2 keys_zone=cache_one:200m  inactive=1d  max_size=30g ;

 

upstream my_server_pool

{

server 192.168.1.2:80 weight=1 max_fails=2 fail_timeout=30s;

server 192.168.1.3:80 weight=1 max_fails=2 fail_timeout=30s;

server 192.168.1.4:80 weight=1 max_fails=2 fail_timeout=30s;

}

 

server

{

listen 80;

server_name www.xiaozhe.com;

root /data0/htdocs;

 

location ~ .*\.(php|php5)$

{

#使用web缓存区cache_one

fastcgi_cache cache_one;

 

#对不同的HTTP状态码设置不同的缓存时间

fastcgi_cache_valid 200 304 12h;

fastcgi_cache_valid 301 302 1m;

fastcgi_cache_valid any 1m;

 

#设置Web缓存的key值

fastcgi_cache_key 127.0.0.1:9000$request_uri;

 

 

#fastcgi服务器配置

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fcgi.conf;

}

access_log off;

}

}

 

 

稍微留意一下Sina的Ncache模块,主要是兼容性不怎么好,很多系统不能使用。

你可能感兴趣的:(9 Nginx的Web缓存服务)