北京SEO

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

2019/10/10/17:46:30  阅读:1723  来源:谷歌SEO算法  标签: SEO培训

下面来到各位介绍一篇章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种不同业务分配,配置如下:

  1. #product业务的后端
  2. upstreamproduct_tomcats{
  3. server127.0.0.1:8081weight=10;
  4. server127.0.0.1:8082weight=10;
  5. }--phpfensi.com
  6. #cart业务的后端
  7. upstreamcart_tomcats{
  8. server127.0.0.1:8083weight=10;
  9. server127.0.0.1:8084weight=10;
  10. }
  11. #goods业务的后端
  12. upstreamgoods_tomcats{
  13. server192.168.12.34:8081weight=10;
  14. server192.168.12.34:8082weight=10;
  15. }

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

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

  1. GET/goods/2222.htmlHTTP/1.1
  2. location/{
  3. proxy_cachecache_one;
  4. proxy_cache_key"$host:$server_port$request_uri";
  5. proxy_cache_valid20030420m;
  6. rewrite/product/([0-9]+)\.html/index.jsp?id=$1last;
  7. rewrite/cart/([0-9]+)\.html/index1.jsp?id=$1last;
  8. rewrite/goods/([0-9]+)\.html/index2.jsp?id=$1last;
  9. #判断是否匹配product通过正则,如果匹配将请求转发到product_tomcats集群上
  10. if($request~*.*/product/(.*)){
  11. proxy_passhttp://product_tomcats;
  12. }
  13. #判断是否匹配cart通过正则,如果匹配将请求转发到cart_tomcats集群上
  14. if($request~*.*/cart/(.*)){
  15. proxy_passhttp://cart_tomcats;
  16. }
  17. #判断是否匹配goods通过正则,如果匹配将请求转发到goods_tomcats集群上
  18. if($request~*.*/goods/(.*)){
  19. proxy_passhttp://goods_tomcats;
  20. }--phpfensi.com
  21. proxy_set_headerHost$host;
  22. proxy_set_headerX-Forwarded-For$remote_addr;
  23. add_headerX-Cache'$upstream_cache_statusfrom$host';
  24. }

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

Nginx cache挂载内存文件系统,我们采用tmpfs内存文件系统,来做缓存文件系统,这样可以让系统不经过I/O提高效率.

挂载tmpfs:mount tmpfs自定义名称 挂载位置 -t tmpfs -o size=分配空间大小.

例,代码如下:

  1. mkdir/tmpfs
  2. mountmy_tmpfs/tmpfs-ttmpfs-osize=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";

建议采用第一种.

下面是对缓存内容进行的配置,代码如下:

  1. #日志配置
  2. #$upstream_addr请求后端的地址
  3. #$upstream_status请求后端响应状态
  4. #$upstream_cache_status缓存状态
  5. log_formatmain'$remote_addr-$remote_user[$time_local]'
  6. "$request"$status$bytes_sent'
  7. '"$http_referer""$http_user_agent"'
  8. '"$gzip_ratio"'
  9. '"addr:$upstream_addr-status:$upstream_status-cachestatus:$upstream_cache_status"';
  10. #缓冲代理请求,proxy_temp_path需要和proxy_cache_path在一个分区下
  11. proxy_temp_path/tmpfs_cache/proxy_temp_path;
  12. #缓存地址为/tmpfs_cache/proxy_cache_path,缓存目录级别分为2级,
  13. #cache名称为cache_one,内存缓存空间大小为500M,自动清除超过1天未访问的缓存数据,缓存硬盘空间为15G
  14. proxy_cache_path/tmpfs_cache/proxy_cache_pathlevels=1:2keys_zone=cache_one:500minactive=1dmax_size=15g;
  15. server{
  16. listen80;
  17. server_namewww.xxx.com;
  18. charsetutf-8;
  19. access_loglogs/cache_test.access.logmain;
  20. error_loglogs/cache_test.error.logwarn;
  21. autoindexon;
  22. indexindex.html;
  23. location/{
  24. #使用缓存cache_one上面proxy_cache_path中定义的key_zone=cache_one;
  25. proxy_cachecache_one;
  26. #缓存key拼接规则:域名:端口获取浏览器请求的URL完整地址
  27. proxy_cache_key"$host:$server_port$request_uri";
  28. #对HTTP状态码200和304的缓存20分钟
  29. proxy_cache_valid20030420m;
  30. #获取proxy的真实域名
  31. proxy_set_headerHost$host;
  32. proxy_set_headerX-Forwarded-For$remote_addr;
  33. #设置浏览器中的header可查看该页面的缓存状态
  34. add_headerX-Cache'$upstream_cache_statusfrom$host';
  35. }

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即使你只使用下列语句设置:

  1. proxy_cache_methodsPOST;
  2. 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参数指定,注意每一个定义的内存池必须是不重复的路径,例如:

  1. proxy_cache_path/data/nginx/cache/onelevels=1keys_zone=one:10m;
  2. proxy_cache_path/data/nginx/cache/twolevels=2:2keys_zone=two:100m;--phpfensi.com
  3. proxy_cache_path/data/nginx/cache/threelevels=1:1:2keys_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

为不同的应答设置不同的缓存时间,例如:

  1. proxy_cache_valid20030210m;
  2. proxy_cache_valid4041m;

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

proxy_cache_valid 5m;

那么只对代码为200, 301和302的应答进行缓存,同样可以使用any参数任何应答.

  1. proxy_cache_valid20030210m;
  2. proxy_cache_valid3011h;
  3. proxy_cache_validany1m;

广告内容

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

相关阅读

热门评论

sunshine技术博客 sunshine技术博客

sunshine技术博客

总篇数164

精选文章

RMAN中catalog和nocatalog区别介绍 小技巧:为Linux下的文件分配多个权限 zimbra8.5.1安装第三方签名ssl证书的步骤 解决mysql不能远程连接数据库方法 windows服务器mysql增量备份批处理数据库 mysql中slow query log慢日志查询分析 JavaScript跨域问题总结 Linux下负载均衡软件LVS配置(VS/DR)教程 mysql中权限参数说明 MYSQL(错误1053)无法正常启动

SEO最新算法