1.概述
Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持404/301/302这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx模块,可以清除指定URL的缓存。
Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。
最新的Nginx 0.8.32版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定URL的缓存),已经可以完全取代Squid。我们已经在生产环境使用了 Nginx 的 proxy_cache 缓存功能超过两个月,十分稳定,速度不逊于 Squid。
在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为“负载均衡服务器”与“Web缓存服务器”来使用。
2.Nginx 负载均衡与缓存服务器在 Linux 下的编译安装:
ulimit -SHn 65535
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.gz
tar zxvf pcre-8.00.tar.gz
cd pcre-8.00/
./configure
make && make install
cd ../
wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz
tar zxvf ngx_cache_purge-1.0.tar.gz
wget http://nginx.org/download/nginx-0.8.32.tar.gz
tar zxvf nginx-0.8.32.tar.gz
cd nginx-0.8.32/
./configure --user=www --group=www --add-module=../ngx_cache_purge-1.0 --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
cd ../
3.proxy_cache完整示例
(1)首先,把第三方的ngx_cache_purge模块编译安装到Nginx中,用来清除指定URL的缓存
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.gz
tar zxvf pcre-8.00.tar.gz
cd pcre-8.00/
./configure
make && make install
cd ../
wget http://labs.frickle.com/files/ngx_cache_purge-1.0.tar.gz
tar zxvf ngx_cache_purge-1.0.tar.gz
wget http://nginx.org/download/nginx-0.8.32.tar.gz
tar zxvf nginx-0.8.32.tar.gz
cd nginx-0.8.32/
./configure --user=www --group=www --add-module=../ngx_cache_purge-1.0
--prefix=/usr/local/webserver/nginx --with-http_stub_status_module
--with-http_ssl_module
make && make install
cd ../
(2)然后,在同一分区下创建两个缓存目录,分别供proxy_temp_path , proxy_cache_path
指令设置缓存路径.注:两个指定设置的缓存路径必须为同一磁盘分区,不能跨分区.
mkdir -p /data0/proxy_temp_path
mkdir -p /data0/proxy_cache_path
(3)Nginx配置文件(nginx.conf)对扩展名为gif,jpg,jpeg,png,bmp,swf,js,css的图片,flash,javascript , css文件开启Web缓存,其他文件不缓存.
示例代码如下:
######################################### 示例1开始 ############################################
http{
proxy_temp_path /data0/proxy_temp_path ;
#设置Web缓存区名称为cache_one,内存缓存空间大小为500M,自动清除超过1天没有被
#访问的缓存数据,硬盘缓存空间大小为30G
proxy_cache_path /data0/proxy_cache_path levels=1:2
keys_zone=cache_one:200m inactive=1d max_size=30g ;
server{
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$
{
#使用Web缓存区cache_one
proxy_cache cache_one ;
#对不同HTTP状态码缓存设置不同的缓存时间
proxy_cache_valid 200 304 12h ;
proxy_cache_valid 301 302 1m ;
proxy_cache_valid any 1m ;
#设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存,这里根据"域名,URI,
#参数"组合成Key
proxy_cache_key $host$uri$is_args$args;
}
#用于清除缓存,假设一个URL为http://my.domain.com/test.gif,通过访问
#http://my.domain.com/purge/test.gif可以清除该URL的缓存
location ~ /purge(/.*)
{
#设置只允许指定的IP或IP段才可以清除URL缓存
allow 127.0.0.1 ;
allow 192.168.0.0/16 ;
deny all ;
proxy_cache_purge cache_one $host$1$is_args$args ;
}
}
}
######################################### 示例1 结束############################################
4.fastcgi_cache完整示例
(1)首先,在同一分区下创建两个缓存目录,分别供fastcgi_temp_path,fastcgi_cache_path指令设置缓存路径.注:两个指定设置的缓存路径必须为同一磁盘分区,不能跨分区.
mkdir -p /data0/fastcgi_temp_path
mkdir -p /data0/fastcgi_cache_path
(2)Nginx配置文件(nginx.conf)对扩展名为gif,jpg,jpeg,png,bmp,swf,js,css的图片,Flash,JavaScript,CSS文件开启Web缓存,其他文件不缓存.
示例代码如下:
######################################### 示例2 开始############################################
http{
#fastcgi_temp_path和fastcgi_cache_path指定的路径必须在同一分区
fastcgi_temp_path /data0/fastcgi_temp_path ;
#设置Web缓存区名称为cache_one,内存缓存空间大小为500MB,自动清除超过1天没有被
#访问的缓存数据,硬盘缓存空间大小为30G
fastcgi_cache_path /data0/fastcgi_cache_path levels=1:2
keys_zone=cache_one:200m inactive=1d max_size=30g ;
server{
location ~ .*.(php|php5)$
{
#使用Web缓存区cache_one
fastcgi_cache cache_one ;
#对不同的HTTP状态码缓存设置不同的缓存时间
fastcgi_cache_valid 200 10m ;
fastcgi_cache_valid 301 302 1h ;
fastcgi_cache_valid an 1m ;
#设置Web缓存的key值,Nginx根据key值md5哈希存储缓存,这里根据"FastCGI服务
#器的IP,端口,请求的URI"组合成Key。
fastcgi_cache_key 127.0.0.1:9000$requet_uri ;
#FastCGI服务器
fastcgi_pass 127.0.0.1:9000 ;
fastcgi_index index.php ;
include fcgi.conf ;
}
}
}
######################################### 示例2 结束############################################