正文:
视频播放协议请求应用于多个业务产品,为了提供一个稳定的解析服务,当CMS、媒资、聚合平台等产品对视频信息发生的增、删、改操作时,通过监控DB服务将变化实时写入高性能简单消息队列服务,及时更新多个对外视频服务产品的视频信息更新.
[img]http://dl.iteye.com/upload/attachment/297160/34e1e8d3-267b-31aa-9bd4-30ae9c6fbcfb.jpg[/img]
1.Nginx服务通过内嵌的perl脚本动态解析URL参数.提取key信息.
2.设置storm_perl的负载均衡服务
3.Nginx服务通过key信息查找本地是否存在对应的缓存数据,如果存在直接返回给客户端.
设置nginx开启本地缓存,并指定缓存存放位置及相关信息.
设置后端请求的header信息,缓存时间,
4..Nginx服务通过内嵌的perl脚本动态读取memcache服务的数据,读取失败后,直接将请求转向后端的apache服务器
当读取memcache的请求返回404时,直接转向另外一个location
视频播放协议请求应用于多个业务产品,为了提供一个稳定的解析服务,当CMS、媒资、聚合平台等产品对视频信息发生的增、删、改操作时,通过监控DB服务将变化实时写入高性能简单消息队列服务,及时更新多个对外视频服务产品的视频信息更新.
[img]http://dl.iteye.com/upload/attachment/297160/34e1e8d3-267b-31aa-9bd4-30ae9c6fbcfb.jpg[/img]
1.Nginx服务通过内嵌的perl脚本动态解析URL参数.提取key信息.
perl_set $storm_key_new '
use MIME::Base64::Perl;
use URI::Escape;
sub{
my $r = shift;//request请求对象
my $request_uri = $r->variable("request_uri");//提取uri
my $query_uri = $r->unescape($request_uri);
my $buffer = $query_uri;
if($buffer =~/&/){//判定uri中是否包含&符号
my @pairs = split(/&/, $buffer);//根据&符号分割数组
foreach $pair (@pairs)
{
if($pair =~ /c=storm/i){//提取"c=storm"的字符串
$pair =~ s/c=//g;//将"c="剔除
return $pair;
}
}
}
}
';
2.设置storm_perl的负载均衡服务
upstream storm_perl {
server 192.168.1.87:8000 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.110:8000 weight=1 max_fails=2 fail_timeout=30s;
}
3.Nginx服务通过key信息查找本地是否存在对应的缓存数据,如果存在直接返回给客户端.
设置nginx开启本地缓存,并指定缓存存放位置及相关信息.
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path /opt/data/proxy_temp_dir;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
proxy_cache_path /opt/data/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
设置后端请求的header信息,缓存时间,
location / {
#定义客户端缓存一小时
expires 1h;
#后端服务请求返回的状态码为502,504,error,超时等,自动转入下个后端服务器
proxy_next_upstream http_502 http_504 error timeout invalid_header;
#进行缓存,使用Web缓存区cache_one
proxy_cache cache_one;
#对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 304 30d;
proxy_cache_valid 404 1m;
#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_cache_key $storm_key_new;
#设置后端服务请求的host信息
proxy_set_header Host $host;
#设置客户端的真实IP地址
proxy_set_header X-Forwarded-For $remote_addr;
#将请求转向upstream
proxy_pass http://storm_perl;
error_log /opt/modules/nginx/logs/error.log crit;
access_log /opt/modules/nginx/logs/access.log main;
}
4..Nginx服务通过内嵌的perl脚本动态读取memcache服务的数据,读取失败后,直接将请求转向后端的apache服务器
#设置memcache服务的IP和端口
set $memd 0;
set $memcached_server "127.0.0.1:11211";
location ~ .*\.(php|jsp|cgi)?
{
perl 'sub {
use Cache::Memcached;
my $r = shift;
if($r->variable("memd")){
my $memd = $r->variable("memd");
}
if(!$memd){
$memd = new Cache::Memcached {"servers" => [$r->variable("memcached_server")],"debug" => 0,"compress_threshold" => 10_000};
$r->variable("memd",$memd);
}
my $realkey = 0;
$realkey = $r->variable("storm_key_new");
my $stormbox = $memd->get($realkey);
if($stormbox){
$r->send_http_header;
$r->print($stormbox);
return 200;
}else{
return 404;
}
}';
error_page 404 500 502 503 504 =[color=red] @get_storm;[/color]
access_log /opt/modules/nginx/logs/log_mm.log count;
}
当读取memcache的请求返回404时,直接转向另外一个location
location @get_storm {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
access_log /opt/modules/nginx/logs/log_db.log count;
}