注册 登录
落伍者 返回首页

拒绝游泳的鱼的个人空间 https://www.im286.net/?78295 [收藏] [复制] [RSS]

日志

Nginx的Web缓存服务与新浪网的开源NACHE模块(有错字)

已有 1984 次阅读2010-4-29 18:11

第9章
Nginx的Web缓存服务与新浪网的开源NACHE模块
9.1  什么是Web缓存
    Web存位于内容源Wet)服务器和客户端之间,当用户访问一个url时,WEB缓存服务器
会去后端web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的
URL,web缓存服务器直接输出内容给客户端,而不是向源服务器再次发送请求。web缓存降
低了内容源web服务器、数据库的负载,减少了网络延迟,提高了用户访问的响应速度,增强
了用户体验。
    web缓存服务器中,最著名的要数Squid Cache(简称为Squid),已经在大多数网站中使用。
Squid是一个流行的自由软件(GNU通用公共许可证)的代理服务器和web缓存服务器。Squid
有广泛的用途,从作为网页服务器的前置cache服务器缓存相关请求来提高web服务器的速度,
到为一组人共享网络资源而缓存万维网、域名系统和其他网络搜索,到通过过滤流量帮助网络安
全,到局域网通过代理上网。Squid主要设计用于在Unix一类系统运行。
    现在,新版本Nginx的proxy—cache指令开始支持web缓存服务,另外,新浪网为Nginx开
发的NCACHE模块,也能够支持web缓存服务,解决了Squid不能充分利用多核CPU的局限,
速度比Squid更快。
130    第9章Nginx的Web缓存服务与新浪网的开源NCACHE模块
9.2 Nginx的Web缓存服务
    Nginx从0.7.48版开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,
用md5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录内。
它可以支持任意URL链接,同时也支持40413011302这样的非200状态码。虽然目前官方的Nginxweb
缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指
定缓存页面,但是,通过一个第三方的ngx_cache_purge模块,可以清除指定URL的缓存。
    金山逍遥网已经在生产环境使用Nginx的proxy—cache缓存功能多月,十分稳定,速度不
逊于Squid。在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓
存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载
均衡、健康检查、后端服务器故障转移、重写、易用性上,Nginx也比Squid强大很多。这使得
一台Nginx可以同时作为“负载均衡服务器”与“Web缓存服务器”来使用。
    Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi相关指令集构成,前者用于
反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两
者的功能基本上一样。
9.2.1 proxy_cache相关指令集
  1。proxy_cache指令
  语法:proxy_cache zone_name;
  默认值:None
  使用环境:http,server,location
  该指令用于设置哪个缓存区将被使用,zone_name的值为proxy_cache_path指令创建的缓存
区名称。
  2。proxy_cache—path指令
  语法:proxy—cache_path path[1evels=number]keys—zone=zone—name:zone_size[inactive=time]
[max—size=size];
  默认值:None
  使用环境:http
  该指令用于设置缓存文件的存放路径。示例如下:
9.2 Nginx的Web缓存服务
131
proxy_cache_path/dataO/proxy_cache_dir
  500m inactive=id max_size=309;
    注意该指令只能在http标签内配置,levels指定该缓存空间有两层hash目录,第一层目录为
1个字母,第二层为2个字母,保存的文件名会类似,/datao/proxy_cache_dirle/29/b7f54b2df'1773722d.
382f4809d65029c:keys_zone参数用来为这个缓存区起名,500m指内存缓存空间大小为500MB;
inactive的Id指如果缓存数据在1天内没有被访问,将被删除;max—size的309是指硬盘缓存空
间为30GB。
  3。proxy_cache_methods指令
  语法:proxy_cache_methods[GET HEAD POST];
  默认值:proxy_cache_methods GET HEAD;
  使用环境:http,server,location
  该指令用于设置缓存哪些H兀甲方法,默认缓存HTTP GET/HEAD方法,不缓存H1,rP POST
方法。
  4.proxy_cache_min_uses指令
  语法:pmxy_-cache_min_uses the_number;
  默认值:proxy_cache_min_uses l:
  使用环境:http,server,location
  该指令用于设置缓存的最小使用次数,默认值为l。
  5.proxy_cache_valid指令
  语法:proxy cache_valid reply_code【reply_code…】time;
  默认值:None
  使用环境:http.server,location
  该指令用于对不同返回状态码的URL设置不同的缓存时间,例如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404    im;
    设置200、302状态的URL缓存10分钟,404状态的URL缓存1分钟。
proxy_cache_val id 5m;
    如果不指定状态码,直接指定缓存时间.则只有200、301、302状态的URL缓存5分钟。
proxy_cache_valid 200 302 lore;    .

第9章Nginx的Web缓存服务与新浪网的开源NCACHE模块
proxy_cache_valid any im;
对没有单独设置的状态码,全部设置缓存时间为1分钟。
6。proxy_cache—key指令
语法:proxy—cache—key line;
默认值:None
使用环境:http,server,location
    该指令用来设置Web缓存的Key值,Nginx根据Key值rod5哈希存储缓存。一般根据$host
(域名)、$request_uri(请求的路径)等变量组合成proxy—cache_key。例如:
proxy_cache key " $host:$server__Dort$uri$is_args$args”;
9.2。2 proxy_cache完整示例
    上一节中,我们已经介绍了proxy—cache的相关指令集,现在来看一个proxy—cache的完整
示例。
    (1)首先,我们要按照以下步骤,把第三方的ngx—cache_purge模块编译安装到Nginx中,
用来清除指定URL的缓存,示例如代码9—1所示。
代码9.1
ulimit—SHn 65535
wget ftp://ftp.CSX.caIn.ac.uk/pub/software/programming/pcre/pcre一8.00.tar.gz
tar zxvf Pcre一8.00.tar.gZ
Cd Dcre一8.00/
.|configure
make&&make imstall
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_cachejourge一1.0
————prefix=/usr/local/webserver/nginx————wiLh——http_stub_status_module
————with——http.SSl modUle
make&&make install
Cd../
    (2)然后,在同一分区下创建两个缓存目录,分别供proxy—temp—path、proxy—cache_path
指令设置缓存路径。
9.2 Nginx的Web缓存服务
133
注:两个指定设置的缓存路径必须为同一磁盘分区,不能跨分区。
mkdir—p/dataO/proxy_temp__path
mkdir—P/dataO/proxy_cache path
    (3)Nginx配置文件(nginx.conf):对扩展名为gif、jPg、jpeg、png、bmp、swf、jS、CSS
的图片、Flash、JavaScript、CSS文件开启Web缓存,其他文件不缓存,示例如代码9—2所示。
代码9-2
USer  www www;
worker processes 8;
error_log/datal/109s/nginx_error.109 crit;
pid    /usr/10cal/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker rlimit nofile 51200;
eventS
(
use epoll;
worker_connections 51200;
)
http
(
include    mime.types:
 default_type appiication/octet—stream;
#charset utf一8:
server_names—hash_bucket_size 128;
C1ient—header buffer_size 32k;
large_client-header burfers 4 32k;
sendfile on;
#七cp—nopush    on;
keepal ive_t imeout 3 0;
tcp nodelay on;
#注:proxy_temp_path和proxy—cache_path指定的路径必须在同一分区
proxy_temp_path/data0/proxy_temp_path;
#设置Web缓存区名称为cache_one,内存缓存空间大小为500MB,自动清除超过1天没有被访问的缓存数据
硬盘缓存空间大小为30GB。
proxy_cache_path/data0/proxy_cache_path 1evels=1:2  keys_zone:cache_one:2 0 0m
inactive=id max    =  size 30a

134    第9章Nginx的Web缓存雕务与新浪网的开源NCACHE模块
upstream my_server_pe01(
server  192.168.1。2:80 weight--i max_fails=2 fai l_timeout=30s:
server  1 92.168.1.3:80 weight--i max_fails=2 fail_timeout=30s;
server    192.168.1.4:80 weight=l max fails=2 fail—timeout=30s;
)
8erVer
t
 1isten 80:
 server name my.domain.COm;
location/
(
    proxy_set_header Hos t$host;
    Proxy_set_header X—Forwarded-For$remote_addr:
    proxy_/Dass ht tp://my_server_pool
)
location~.* \.(gifI JpgIjpegIpngIbmpI swfljsICSS)$
{
    #使用Web缓存区cache_one
    proxy_cache cache one j
#时不同HTTP状志码缓存设置不同的缓存时闻
proxy_cache valid 200 3 04 12hj
proxy_cache_valid 301 302 im;
proxy_cache_val id any Im;
#设置Web鹱存的Key值,Nginx根据Key值md5哈希存储镁存,这里根据“域名,URI、参数”组
合成Key。
proxy_cache_key Shos t Suri$i s argsSargs j
#反向代理,访问后端内容瓣服务器
proxy_set_header Hos t Shost j
proxy set_header X—Forwarded—For Sremote addrj
proxy_pass ht tp://邢y_server_pool j
#用于清除缓存,假设一个URL为http://ⅡIy。domain.com/test.gi£,通过访问
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  Shost$1$i s_args$args;
)
access_log off;
9.2 Nginx的Web缓存服务
135
9.2。3 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[1evels=number]keys—zone=zone_name:zone_size[inactive=time]
【max—size=size];
  默认值:None
  使用环境:http
  该指令用于设置缓存文件的存放路径。示例如下:
fastcgi_cache_path/dataO/fastcgi_cache_dir leveis=l:2  keys_zone=cache_one:500m
inactive=ld max_size=3 Og;
    注意该指令只能在http标签内配置,levels指定该缓存空间有两层hash目录,第一层目录为
1个字母,第二层为2个字母,保存的文件名会类{以/dataO/fastcgi_cache_didc/29/b7f54b2df-
7773722d382f4809d65029c;keys—zone参数用来为这个缓存区起名,500m指内存缓存空间大小
为500MB;inactive的Id指如果缓存数据在l天内没有被访问,将被删除;max—size的309是指
硬盘缓存空间为30GB。
  3.fastcgi—cache—methods指令
  语法:fastcgi—cache_methods【GET HEAD POST];
  默认值:fastcgi_cache_methods GET HEAD;
  使用环境:http,server,location
  该指令用于设置缓存哪些HTTP方法,默认缓存HTTP GET/HEAD方法,不缓存HTTP POST
方法。
  4.fastcgi_cache—min—uses指令
  语法:fastcgi—cache—min—uses the_number;
136    第9章Nginx的Web缓存服务与新浪网的开源NCACHE模块
  默认值:fastcgi_cache—min—uses 1;
  使用环境:http,server,location
  该指令用于设置缓存的最小使用次数,默认值为1。
  5.fastcgi—cache—valid指令
  语法:fastcgi—cache—valid reply_code【reply—code…】time;
  默认值:None
  使用环境:http,server,location
  该指令用于对不同返回状态码的URL设置不同的缓存时间,例如:
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 404    1m;
    设置200、302状态的URL缓存10分钟,404状态的URL缓存1分钟。
fastcgi_cache_valid 5m;
    如果不指定状态码,直接指定缓存时间,则只有200、301、302状态的URL缓存5分钟。
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
    对没有单独设置的状态码,全部设置缓存时间为1分钟。
    6。fastcgi—cache—key指令
    语法:fastcgi—cache_key line;
    默认值:None
    使用环境:http,server,location
    该指令用来设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存。一般根据FastCGI
服务器的地址和端口、$request_uri(请求的路径)等变量组合成fastcgi—cache_key。例如:
fastcgi cache key 127.0。0.1:9000$request uri;
9~2 4 fastcgi—cache完整示例
    上一节中,我们已经介绍了fastcgi—cache的相关指令集,现在来看一个fastcgi—cache的完整
示例:
    (1)首先,在同一分区下创建两个缓存目录,分别供fastcgi—temp—path、fastcgi—cache_path
指令设置缓存路径。
9.2 Nginx的Web缓存服务
137
注:两个指定设置的缓存路径必须为同一磁盘分区,不能跨分区。
mkdir—p IdaCa0/fastcgi_temp__path
mkdir—P/data0/fastcgi_cache_path
    (2)Nginx配置文件(nginx.conf):对扩展名为gif、jpg、jpeg、prig、bmp、swf、jS、CSS
的图片、FLash、JavaScript、CSS文件开启Web缓存,其他文件不缓存。示例如代码9-3所示。
代码9.3
USer WWW WWW;
worker_processes 8;
error_log/datal/109s/nginx_error.109 crit;
pid    /usr/local/webserver/nginx/nginx.pid;
#Speci lies the value for maximum file descriptors that can be opened 13y this process.
worker_rlimit_nofile 51200:
eventS
(
use epoli;
 worker_connections 51200;
)
http
(
include    mime.types;
default_type application/octet-stream;
#charset utf一8;
server names hash bucket siZe 128;
C1ient_header_buffer_size 32k;
large_client_header buffers 4 32k;
sendfile ON;
#tcp_nopush    on;
keepal ive—t imeout 3 0;
tcp nodelay eli;
#注:fas tcgi—temp_path和fastcgi_cache_path指定的路径磐须在同一分区
fas t cg i_temp_path/data0/fastcgi_temp_path i
{}设置Web缓存区名称为cache_one,内存缓存空闻大小为500MB,自动清除超过l天没有被访问的缓存数据,
  硬盘缓存空间大小为30GB。
fastcgi cache_Dath/data0/fastcgi_cache__oath levels=1:2
keys_zone=cache_one:200m inactive=1d Max size=30a;
138
第9章Nginx的Web缓存服务与新浪网的开源NCACHE模块
upstream my_server_pool(
  server  192.168.1.2:80 weight=1 max_faiis=2 fail_timeout=30s;
  server  192.168.1.3:80 weight=1 max_faiis=2 fail_timeout=30s;
  server  192.168.1.4:80 weight=1 max_fails=2 fail_timeout=30sj
1
server
(
  1isten 80;
  server_name my.domain.com;
  root/data0/htdocs;
location~.+\.(phplphp5)$
    #使用Web缓存区cache—one
    fas七cgi—cache cache_one;
#对不同HTTP状态码缓存设置不同的缓存时间
fastcgi_cache_valid 200 10m;  ’
fastcgi cache valid 3 01 3 02 lh;
fastcgi_cache_valid any im;
#设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存,这里根据“FastCGI服务器的IP、
端口、请求的URI”组合成Key。
fastcgi_cache_key 127.0.0.1:9000$request_uri;
#FastCGI服务器
fastcgi_pass 127.0.0.1:9000;
fastcgi index index.phpj
include fcgi.conf j
access_log off;
9.3新浪网开源软件项目
网页缓存系统
基于Nginx的NCACHE
    NCACHE是基于Nginx的Web服务器模型构建起来的缓存系统,是新浪公司的开源产
品。NCACHE最早的时候是作为Nginx的一个HTTP模块进行开发的,因为当时希望获得更好
的兼容性和可扩展性,作为独立模块,可以被更好地推广和使用,安装也会很方便。但后来发现
随着代码量的增加、功能的扩充,Nginx的原有模块框架已经不能很好地满足要求了,因此,我
们提取了Nginx的内核代码,并把CACHE部分嵌入其中,形成了今天的NCACHE。
9.3新浪网开源软件项目——基于Nginx的NCACHE网页缓存系统    139
    NCACHE本身功能并不强大,且不具备像SQUID般完善的功能和开发框架,甚至不能支持
RFC中关于CACHE部分的描述。NCACHE完全是一套定制化的产品,可以满足要快速部署、
简单易用、大并发量、大存储量的需求,它不需要复杂的配置,不需要冗余的复杂代码,并使用
最先进的技术组合。
    NCACHE 2.0版本,是作为一个完整的Nginx模块进行发布和使用的,从原有的NCACHE
内核中进行了剥离,更方便开发者的安装和配置。
    NCACHE 3.0版本,相对于2.0版本有了很大的改进,对文件的缓存不再使用传统的目录模
式,而是通过MMAP一个大文件,在其中以页分配的形式存储缓存数据,由操作系统来负责决
定哪些数据应该留在内存里,这与VARNISH缓存的原理是一致的,大大提高了IO性能,目前
该版本只支持64位Linux和FREEBSD系统。
9。3。1  NCACHE模块的安装
    NCACHE需要在编译Nginx时,将自己编译进Nginx。NCACHE模块最新的版本为
ncache一3.1.64,目前该版本只支持64位Linux和FREEBSD操作系统,ncache一3.1.64能够兼容
nginx一0.6.x系列版本,目前还不兼容nginx一0.7.x、nginx一0.8.x版本。
    下面,我们将ncache一3.1.64版本编译进nginx一0.6.39,如代码9.4所示:
代码9-4
mkdir—P/data0/SOftware
cd/data0/SOftware
wget http://ncache.googlecode.com/files/ncache一3…1 64 1inux.tam.gz
tam zxvf ncache一3.1 64 1iflUX.tam.gz
wget http://sysoev.ru/nginx/nginx一0.6.3 9.tar.gz
tar zxvf nginx一0.6.3 9.tam.gz
cd nginx一0.6.3 9/
./configure一一prefix=/USr/10cal/webserver/ncache一一add—module=../ncache
一一group=www一一with—http_stub_status_module一一with—http.ssl一module
make&&make instal 1
9。3.2 NGAGH E配置文件编写
    创建配置文件/usr/local/webserver/ncache/conf/nginx。Conf,如代码9—5所示:
代码9-5
worker_processes 4;

140    第9章Nginx的Web缓存服务与新浪网的开源NCACHE模块
worker_rlimit_nofile 20480:
error_log logs/error。log i
eVen匕S
)
http
(
use epollj
worker_connect ions 8 1 92 0 i
keepalive_t imeout i0;
ncache_max_si ze 2 4 i
proxy_buf fering of f i
ncache_dir/datal/cache_fi le
ncache_dir/data2/eache_fi le
60 i#the file for storage.60G
60;
hash—index_dir/data]/ncache_index;#v3.1,you need to define the index file
 position
auto_delete_fi le On;#enable the auto delete fi le
ncachsjgnore_client_no_cache Onj
ups tream backend
t
    Server 10.0.0.1:
)
sendfile Olqi
send_timeout 1 0;
client_header一七imeout 10;
tcp__nodelay on;
log_format main‘$proxy_add_x_forwarded_for—Sremote_user【$time_local】
    。”$request“Sstatus Sbytes_sent。
    。”Sht tp_re ferer’”$ht tp_user_agent”Sremote_addr’!
include”mime.types 1。;
default—七ype text/html j
SerVer
(
server_name.blog。sina.COm.cn;
9.3新浪网开源软件项目——基于Nginx的NCACHE网页缓存系统    141
listen+:80;
set$xvia”blog.sina.com.cn”;
set Sproxy_add_agent”Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.1;
NginxCache)”;
access_log logs/blog.sina.com.cn—access_log main;
10cation/
(Srequest_method~”PURGE”)
    rewrite《.+)/PURGESl 1ast;
ncache—http_cachej
error_page 404=/fetch$request_uri;
add_header    Sina—Cache  Sxvia;
location/ncache state
(
  ncache_state;
)
location/fetch
(
    internal;
    proxy_pass http://backend;
    add header    Sina—Cache$xvia:
    proxy_hide—header  User—Agent;
    proxy_set_header  User—Agent Sproxy_add_agent;
    proxy_set_header X—Forwarded—For$proxy.add__x—forwarded_for;
)
10cation/PURGE/
(
  access_log logs/purge.blog.sina.com.cn—access_log main;
  internal;
  a110w 10.55.37.0/24:
  allow 10.69.3.0/24j
  allow 10.49.10.0/24;
  deny  a11j
  ncacfle_purge;
)
142    第9章Nginx的Web缓存服务与新浪网的开源NCACHE模块
9。3。3 NCACHE的管理维护
1.运行NCACHE
/usr/local/webserver/ncache/sbin/nginx
  2。停止NCACHE
killall-9 nginx
  3.清除缓存的Shell脚本
#!/bin/sh
kill—9、ps auwxlgrep nginx】awk’(print$2)’、
killall—9 nginx
rm../logs/ncache_index
echo””>../logs/error.109
rm/dataO/ncache file
rm/datal/ncache file
rm/data2/ncache_file
rm/data3/ncache file
  4.查看NCACHE状态
curl”http://127.0.0.1/ncache_state”
9.3。4 NGAGHE后端内容源服务器设置
    (1)必须用H1vrP Header头“Cache—Control:max—age=秒数”来控制缓存时间,如果不指定
将不缓存。
    (2)后端内容源服务器发送NCACHE的H1vrP数据,必须带有“Content—Length”Header
头。
    (3)NCACHE的缓存时间以分钟为单位,会将所有max—age=的秒数值转换为分钟,如果
max—age小于1分钟,NCACHE会将缓存时间设置成1分钟。
    (4)自动删除缓存文件进程,会在每天的凌晨2点删除大约20%的不活动缓存数据。

 

评论 (0 个评论)

论坛客服/商务合作/投诉举报:2171544 (QQ)
落伍者创建于2001/03/14,本站内容均为会员发表,并不代表落伍立场!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
落伍官方微信:2030286 邮箱:(djfsys@gmail.com|tech@im286.com)
© 2001-2014

浙公网安备 33060302000191号

浙ICP备11034705号 BBS专项电子公告通信管[2010]226号

  落伍法律顾问: ITlaw-庄毅雄

手机版|找回帐号|不能发帖?|Archiver|落伍者

GMT+8, 2024-5-18 08:47 , Processed in 0.052868 second(s), 21 queries , Gzip On.

返回顶部