nginx cache静态化+tmpfs 高性能cdn方案 原创-胡志广

标签: nginx cache tmpfs | 发表时间:2014-02-25 18:04 | 作者:wangxiaoxu
出处:http://www.iteye.com
nginx cache静态化+tmpfs 高性能cdn方案 原创-胡志广

博客分类: nginx
cachenginxproxy静态化
1       摘要

本文档主要分为3部分内容:
(1)       解决不同URL访问不同后端的nginx配置方法
(2)       Nginx cache和内存文件系统的配置方法
(3)       Proxy cache的详细配置内容
2       匹配不同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 匹配访问不同后端处理。
3       Nginx cache

3.1     挂载内存文件系统
我们采用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

3.2     配置nginx cache
Nginx cache状态:
l  MISS
l  EXPIRED - expired。请求被传送到后端。
l  UPDATING - expired。由于proxy/fastcgi_cache_use_stale正在更新,将使用旧的应答。
l  STALE - expired。由于proxy/fastcgi_cache_use_stale,后端将得到过期的应答。
l  HIT

proxy_cache_key 可采用2种配法,根据需求来定义:
(1)       通过浏览器获取的URL做KEY
域名:端口 浏览器完整地址(包括动态参数,如:www.xxx.com:80/goods/1.html)
         proxy_cache_key "$host:$server_port$request_uri";
(2)       通过真实的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';
            }      
       
3.3         proxy cache配置详细内容
3.3.1  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";
3.3.2  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;
3.3.3  proxy_cache_min_uses
语法:proxy_cache_min_uses the_number;
默认值:proxy_cache_min_uses 1;
使用字段:http, server, location
多少次请求后应答将被缓存,默认1。
3.3.4  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应该使用在相同的文件系统上。

3.3.5  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;

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [nginx cache tmpfs] 推荐:

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

- - 开源软件 - ITeye博客
本文档主要分为3部分内容:. (1)       解决不同URL访问不同后端的nginx配置方法. (2)       Nginx cache和内存文件系统的配置方法. (3)       Proxy cache的详细配置内容. 2       匹配不同URL访问不同后端. 如果想通过访问不同类别URL分配到不同的后端通过nginx实现,首先举个例子,将需求场景进行描述:.

nginx cache静态化+tmpfs 高性能cdn方案 原创-胡志广

- - 开源软件 - ITeye博客
nginx cache静态化+tmpfs 高性能cdn方案 原创-胡志广. cachenginxproxy静态化. 本文档主要分为3部分内容:. (1)       解决不同URL访问不同后端的nginx配置方法. (2)       Nginx cache和内存文件系统的配置方法. (3)       Proxy cache的详细配置内容.

nginx 设置 expires and Cache-Control

- - 互联网 - ITeye博客
源:http://nginx.org/en/docs/http/ngx_http_headers_module.html. Adds the specified field to a response header provided that the response code equals 200, 201, 204, 206, 301, 302, 303, 304, or 307.

Nginx content cache Nginx内容缓存

- - CSDN博客推荐文章
原文地址: http://nginx.com/resources/admin-guide/caching/. When caching is enabled NGINX saves responses in the cache on the disk and uses them to respond to clients without proxying the requests..

开启nginx cache后导致内存几乎100%问题

- - 开涛的博客
1、前些日子某服务被刷,每分钟达到上几百万请求;当时采用了nginx cache来解决的;但是因为某服务不能缓存太久,当时设置了5s,那么带来的问题就是产生大量小文件,而且很快就删除了. 会发现used是27G;但是通过top查看进程占的内存并没有那么多. SReclaimable: 16474128 kB (这些是内核保持的但是可以释放的inode和dentry的缓存).

Guava cache

- - 孟飞阳的博客
Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制. 整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好.    Guava Cache有两种创建方式:.   通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值.

Java Cache系列之Guava Cache

- - BlogJava-首页技术区
然而作为工具库中的一部分,我们自然不能期待Guava对Cache有比较完善的实现. 因而Guava中的Cache只能用于一些把Cache作为一种辅助设计的项目或者在项目的前期为了实现简单而引入. 在Guava CacheBuilder的注释中给定Guava Cache以下的需求:. 对于这样的需求,如果要我们自己来实现,我们应该怎么设计.

巧用query cache

- - OurMySQL
   收到一用户反馈其应用日志中狂报错误,获取连接超时:. 同时应用报错超出了数据库的最大连接数:max connections:. 这种情况很有可能是有慢sql占用了连接池中的连接没有释放,导致后续进来的请求迟迟获取不到连接池中的连接,导致请求报错,登录数据库排查发现如下sql出现执行非常的慢:.

Cache-control使用Cache-control:private学习笔记

- - Web前端 - ITeye博客
网页缓存由 HTTP消息头中的Cache-control控制,常见取值有private、no-cache、max-age、must- revalidate等,默认为private. 其作用根据不同的重新浏览方式,分为以下几种情况:. 值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器.

MySQL Query Cache 小结

- Eneri - Sky.Jian 朝阳的天空
最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考. 顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的. 具体来说,Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集.