nginx cache静态化+tmpfs 高性能cdn方案

匹配不同URL访问不同后端

如果想通过访问不同类别URL分配到不同的后端通过nginx实现,首先举个例子,将需求场景进行描述:

域名为:www.xxx.com  (本机IP为192.168.12.63)
域名下有3个目录product、cart、goods,这3个目录分别为不同业务,那么我们打算访问3个不同目录下的内容时分别分配到不同的后端进行处理,如访问www.xxx.com/product/xxx.html,那么我们预设是下面3类情况:

访问product下的资源时分配到127.0.0.1:8081和127.0.0.1:8082
访问cart下的资源时分配到127.0.0.1:8083和127.0.0.1:8084
访问goods下的资源时分配到192.168.12.34:8081和192.168.12.34:8082
如果要满足上述需求,那么我们就需要用到nginx的upstream模块和rewrite的if模块配合

首先我们需要配置3个后端,分别满足3种不同业务分配,配置如下:

 代码如下 复制代码

#product业务的后端
upstream product_tomcats{
server 127.0.0.1:8081 weight=10;
server 127.0.0.1:8082 weight=10;
}
#cart 业务的后端
upstream cart_tomcats{
server 127.0.0.1:8083 weight=10;
server 127.0.0.1:8084 weight=10;
}
#goods 业务的后端
upstream goods_tomcats{
server 192.168.12.34:8081 weight=10;
server 192.168.12.34:8082 weight=10;
}

配置好upstream后,我们配置匹配不同目录访问不同后端的内容,通过if语法来实现根据不同请求的url进程正则匹配,然后满足条件的分配到指定的后端,if语句用来实现判断不同URL分配后端配置的功能,具体配置如下:

注:$request变量是获取 http method(GET POST)浏览器访问URL HTTP协议,如:

 代码如下 复制代码

GET /goods/2222.html HTTP/1.1

location / {
proxy_cache cache_one;
proxy_cache_key "$host:$server_port$request_uri";
proxy_cache_valid  200 304 20m;
rewrite /product/([0-9]+)\.html /index.jsp?id=$1 last;
rewrite /cart/([0-9]+)\.html /index1.jsp?id=$1 last;
rewrite /goods/([0-9]+)\.html /index2.jsp?id=$1 last;
#判断是否匹配product通过正则,如果匹配将请求转发到product_tomcats集群上
if ($request ~* .*/product/(.*)){
proxy_pass http://product_tomcats;
}
#判断是否匹配cart通过正则,如果匹配将请求转发到cart _tomcats集群上
if ($request ~* .*/cart/(.*)){
proxy_pass http://cart_tomcats;
}
#判断是否匹配goods通过正则,如果匹配将请求转发到goods _tomcats集群上
if ($request ~* .*/goods/(.*)){
proxy_pass http://goods_tomcats;
}
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
add_header X-Cache '$upstream_cache_status from $host';
}

这样通过upstream配置不同的后端集群组,然后通过if语法的正则匹配URL来分配到不同的集群组上来实现不同种类的URL 匹配访问不同后端处理。

Nginx cache

挂载内存文件系统

我们采用tmpfs内存文件系统,来做缓存文件系统,这样可以让系统不经过I/O提高效率。
挂载tmpfs:
mount tmpfs自定义名称 挂载位置 -t tmpfs -o size=分配空间大小

例:

 代码如下 复制代码

mkdir /tmpfs
mount my_tmpfs /tmpfs -t tmpfs -o size=500m

 

动态调整tmpfs空间大小:
mount 挂载位置 -o remount,size=重新分配空间大小
例:
mount /tmpfs -o remount,size=1024m

卸载已挂载的tmpfs

umount /tmpfs

配置nginx cache

Nginx cache状态:

 代码如下 复制代码

MISS
EXPIRED - expired。请求被传送到后端。
UPDATING - expired。由于proxy/fastcgi_cache_use_stale正在更新,将使用旧的应答。
STALE - expired。由于proxy/fastcgi_cache_use_stale,后端将得到过期的应答。
HIT

proxy_cache_key 可采用2种配法,根据需求来定义:

1.通过浏览器获取的URL做KEY

域名:端口 浏览器完整地址(包括动态参数,如:www.xxx.com:80/goods/1.html)

proxy_cache_key "$host:$server_port$request_uri";

1.通过真实的URL地址做KEY
域名:端口 真实请求地址(不是rewrite后的) ? 参数
(如www.xxx.com:80/index.jsp?id=111)

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

建议采用第一种

下面是对缓存内容进行的配置,例:

 代码如下 复制代码

#日志配置
# $upstream_addr 请求后端的地址
# $upstream_status 请求后端响应状态
# $upstream_cache_status 缓存状态
log_format main  '$remote_addr - $remote_user [$time_local] '
"$request" $status $bytes_sent'
'"$http_referer""$http_user_agent"'
'"$gzip_ratio"'
'"addr:$upstream_addr-status:$upstream_status- cachestatus:$upstream_cache_status"';
#缓冲代理请求,proxy_temp_path需要和proxy_cache_path在一个分区下
proxy_temp_path /tmpfs_cache/proxy_temp_path;
#缓存地址为/tmpfs_cache/proxy_cache_path,缓存目录级别分为2级,
#cache名称为cache_one,内存缓存空间大小为500M,自动清除超过1天未访问的缓存数据,缓存硬盘空间为15G
proxy_cache_path /tmpfs_cache/proxy_cache_path levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=15g;
server {
listen 80;
server_name  www.xxx.com;
charset utf-8;
access_log logs/cache_test.access.log main;
error_log logs/cache_test.error.log warn;
autoindex on;
index index.html;
location / {
#使用缓存cache_one上面proxy_cache_path中定义的key_zone=cache_one;
proxy_cache  cache_one;
#缓存key拼接规则:域名:端口 获取浏览器请求的URL完整地址
proxy_cache_key "$host:$server_port$request_uri";
#对HTTP状态码200和304的缓存20分钟
proxy_cache_valid  200 304 20m;
#获取proxy的真实域名
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
#设置浏览器中的header可查看该页面的缓存状态
add_header X-Cache '$upstream_cache_status from $host';
}

 

proxy cache配置详细内容

proxy_cache_key

语法:proxy_cache_key line;
默认值:$scheme$proxy_host$request_uri;
使用字段:http, server, location

指令指定了包含在缓存中的缓存关键字。
 
proxy_cache_key "$host$request_uri$cookie_user";

注意默认情况下服务器的主机名并没有包含到缓存关键字中,如果你为你的站点在不同的location中使用二级域,你可能需要在缓存关键字中包换主机名:
 
proxy_cache_key "$scheme$host$request_uri";

proxy_cache_methods
语法:proxy_cache_methods [GET HEAD POST];
默认值:proxy_cache_methods GET HEAD;
使用字段:http, server, location

GET/HEAD用来装饰语句,即你无法禁用GET/HEAD即使你只使用下列语句设置:
 
proxy_cache_methods POST;

proxy_cache_min_uses
语法:proxy_cache_min_uses the_number;
默认值:proxy_cache_min_uses 1;
使用字段:http, server, location
多少次请求后应答将被缓存,默认1。

proxy_cache_path
语法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];
默认值:None
使用字段:http
指令指定缓存的路径和一些其他参数,缓存的数据存储在文件中,并且使用代理url的哈希值作为关键字与文件名。levels参数指定缓存的子目录数,例如:
 
proxy_cache_path  /data/nginx/cache  levels=1:2   keys_zone=one:10m;

文件名类似于:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

可以使用任意的1位或2位数字作为目录结构,如 X, X:X,或X:X:X e.g.: “2”, “2:2”, “1:1:2”,但是最多只能是三级目录。
所有活动的key和元数据存储在共享的内存池中,这个区域用keys_zone参数指定。
注意每一个定义的内存池必须是不重复的路径,例如:
proxy_cache_path  /data/nginx/cache/one    levels=1      keys_zone=one:10m;
proxy_cache_path  /data/nginx/cache/two    levels=2:2    keys_zone=two:100m;
proxy_cache_path  /data/nginx/cache/three  levels=1:1:2  keys_zone=three:1000m;

如果在inactive参数指定的时间内缓存的数据没有被请求则被删除,默认inactive为10分钟。
一个名为cache manager的进程控制磁盘的缓存大小,它被用来删除不活动的缓存和控制缓存大小,这些都在max_size参数中定义,当目前缓存的值超出max_size指定的值之后,超过其大小后最少使用数据(LRU替换算法)将被删除。
内存池的大小按照缓存页面数的比例进行设置,一个页面(文件)的元数据大小按照操作系统来定,FreeBSD/i386下为64字节,FreeBSD/amd64下为128字节。
proxy_cache_path和proxy_temp_path应该使用在相同的文件系统上。

proxy_cache_valid
语法:proxy_cache_valid reply_code [reply_code …] time;

默认值:None
使用字段:http, server, location
为不同的应答设置不同的缓存时间,例如:
 
proxy_cache_valid  200 302  10m;
proxy_cache_valid  404  1m;

为应答代码为200和302的设置缓存时间为10分钟,404代码缓存1分钟。
如果只定义时间:
proxy_cache_valid 5m;

那么只对代码为200, 301和302的应答进行缓存。

同样可以使用any参数任何应答。
 
proxy_cache_valid  200 302 10m;
proxy_cache_valid  301 1h;
proxy_cache_valid  any 1m;

时间: 2024-10-25 11:45:58

nginx cache静态化+tmpfs 高性能cdn方案的相关文章

PHP页面静态化两种实现方案(模板标签)

方案:使用模板替换技术(没有时间延迟)  代码如下 复制代码 /* |------------------ | <www.111cn.net> |------------------ */ $oper = $_POST['oper'];//添加操作 if($oper === 'add') {     $title = $_POST['title'];     $content = $_POST['content'];         //如果严格按MVC,这里应该调用model了     $c

网站-网首页静态化-提高访问效率

问题描述 网首页静态化-提高访问效率 请教大家有经验的,比如一个视频网站首页,轮播图和视频可能回1小时更新,视频播放数,点赞数要求实时更新, 这样的首页是不是不适合做静态化啊,如果可以如何做,如何访问效率,不知道大家有什么建议,比如美拍的官网,是静态化的吗,看起来访问速度很快 ,请有经验的前辈谈一谈,如何合计. 解决方案 静态化的本质就是缓存,而且是把磁盘当作缓存,这是一种低级原始低效的做法. 事实上现在有无数的缓存框架,缓存框架都是将内存作为缓存,而且有很好的处理脏数据的策略.所以完全不要再用

Z-Blog分类标签全站静态化方案

Z-Blog目前已经实现了首页和文章页的静态化,可以生成HTML文件,但是系统的分类页.标签Tags页.归档页和作者页都没有实现静态化,本文将讲述一个非常简单的方案,能够自动生成各个分类页.归档页和Tags的静态HTML页面,以便用户将网站迁移到Apache等不支持ASP的主机上. Z-Blog的分类页.标签Tags页.归档页和作者页都是调用catalog.asp这个文件,因此,修改这个文件,当用户调用该文件的时候,自动生成针对该页面的HTML文件.如果访客反复读取这个文件,那么在一定时间范围内

网站性能优化中如何实现页面静态化, nginx+tomcat

问题描述 请教各位大牛一个问题: 现在的项目从客户端到webAPP 经过nginx+tomcat,经过压力测试,事务响应时间很长, 所以想着在nginx/tomcat加上静态页面的缓存, 但是大多文章说的主要是nginx上面使用proxy_cache. 请注意 我这里说的缓存不是针对静态文件(js,css,html,image等), 而是针对整张页面或者局部页面的缓存, 这就有一个问题, nginx不是serlvet容器对于jsp是不能解析的. 我现在的想法是: 1.项目代码上对出口的jsp进行

关于jsp页面的静态化,我想了解一下原理及实现流程

问题描述 现在毫无头绪,希望能得到大家帮准,多谢:) 解决方案 你这静态化是说的url编程伪静态的, 还是真正意义上的静态化?真正意义上的静态化,也有多种方式, 比如你可以定期请求这个jsp,把响应的结果生成静态html文件保存. 定期更新它们.如果只是url看起来是静态的,比如 /a/b/c 或者 /a/b/c.html 这种, 很多web容器自带了urlrewrite模块. 比如resin, nginx等都可以, 在上面配置. 如果是java实现, 用一个叫做 urlrewrite的项目也可

谈*静态页*(或网页*静态化*)

"静态页",在Web应用程序开发中是很常见的概念.只是我发现目前还是有相当部分的朋友,在这方面的存在一定的误区.因此现在独立写一篇文章,也想把一些问题讲讲清楚,以后在讨论的时候也好有个准. 不久前有朋友写了一篇题为<提供生成静态页核心代码>的文章,介绍了一种"向硬盘写入页面文件"的方式.这篇文章的内容在此并不多作讨论,这里引用一下作者给出的摘要: 网页生成静态Html文件有许多好处,比如生成html网页有利于被搜索引擎收录,不仅被收录的快还收录的全.前台

PHP实现页面静态化的超简单方法_php实例

为什么要页面静态化? 1.动态文件执行过程:语法分析-编译-运行 2.静态文件,不需要编译,减少了服务器脚本运行的时间,降低了服务器的响应时间,直接运行,响应速度快:如果页面中一些内容不经常改动,动态页面静态化是非常有效的加速方法.(纯静态,伪静态还是需要PHP解释器的) 3.生成静态URL利于SEO,利于蜘蛛抓取和收录,有利于提升排名 优化页面响应时间方法 1.动态页面静态化 2.优化数据库 3.负载均衡 4.使用缓存等等 //动态页面静态化一般用于不经常改动的地方,频繁改动的地方一般不适用静

艾伟_转载:谈*静态页*(或网页*静态化*)

"静态页",在Web应用程序开发中是很常见的概念.只是我发现目前还是有相当部分的朋友,在这方面的存在一定的误区.因此现在独立写一篇文章,也想把一些问题讲讲清楚,以后在讨论的时候也好有个准. 不久前有朋友写了一篇题为<提供生成静态页核心代码>的文章,介绍了一种"向硬盘写入页面文件"的方式.这篇文章的内容在此并不多作讨论,这里引用一下作者给出的摘要: 网页生成静态Html文件有许多好处,比如生成html网页有利于被搜索引擎收录,不仅被收录的快还收录的全.前台

PHP实现页面静态化的超简单方法

为什么要页面静态化? 1.动态文件执行过程:语法分析-编译-运行 2.静态文件,不需要编译,减少了服务器脚本运行的时间,降低了服务器的响应时间,直接运行,响应速度快:如果页面中一些内容不经常改动,动态页面静态化是非常有效的加速方法.(纯静态,伪静态还是需要PHP解释器的) 3.生成静态URL利于SEO,利于蜘蛛抓取和收录,有利于提升排名 优化页面响应时间方法 1.动态页面静态化 2.优化数据库 3.负载均衡 4.使用缓存等等 //动态页面静态化一般用于不经常改动的地方,频繁改动的地方一般不适用静