nginx cache静态化+tmpfs 高性能cdn方案
发布:smiling 来源: PHP粉丝网 添加日期:2015-04-21 15:46:11 浏览: 评论:0
下面来到各位介绍一篇章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;
- } --phpfensi.com
- #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;
- } --phpfensi.com
- 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; --phpfensi.com
- 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;
Tags: nginx cache静态化 tmpfs
相关文章
- ·monit配置监控启动nginx php mysql redis mongodb 服务器(2014-10-01)
- ·linux中Nginx Rewrite规则工作笔记(2014-10-01)
- ·Linux中利用openssl生成SSL证书给nginx使用(2014-10-11)
- ·linux中编译Nginx支持Tcp_wrappers方法(2014-10-12)
- ·linux中修改Nginx For Tcp_wrappers返回444(2014-10-12)
- ·linux中配合php实现Nginx反向代理(2014-10-13)
- ·linux中Nginx的常用配置(域名跳转 https cdn配置)(2014-10-13)
- ·阿里云linux服务器配置安装nginx(2014-10-13)
- ·linux中Nginx与Lua执行顺序详解(2014-10-14)
- ·linux系统中Nginx守护进程(自动启动nginx)(2014-10-15)
- ·linux中nginx下禁止某目录执行php例子(2014-10-16)
- ·linux系统nginx php-fpm安装php memcache扩展(2014-10-17)
- ·Apache与Nginx登录认证配置详解(可认证目录)(2014-10-17)
- ·linux+nginx+php+mysql环境查找php.ini文件并修改(2014-10-18)
- ·Nginx下proxy_set_header 模块代码(2015-04-21)
- ·linux下Shell脚本分析Nginx日志抗小量ddos攻击(2015-04-21)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)