利用nginx cache缓存网站数据

nginx本身就有缓存功能,能够缓存静态对象,比如图片、CSS、JS等内容直接缓存到本地,下次访问相同对象时,直接从缓存即可,无需访问后端静态服务器以及存储存储服务器,可以替代squid功能。

1环境准备

我们这里只测试nginx的proxy_cache的缓存功能,所以结构越简单越好,这里我们只需要准备一台nginx的虚拟机即可,如果没有nginx,那么我们可以使用epel源,yum安装一个即可:

#添加epel源

root@~>> wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

#yum安装nginx

root@~>> yum install nginx -y

#rpm -ql查看主要配置文件位置

root@~>> rpm -ql nginx

这里为了简单,只使用简单的nginx.conf配置文件:

root@nginx>> cat nginx.conf

user              nginx;

worker_processes  1;

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;

events {

worker_connections  1024;

}

http {

include       /etc/nginx/mime.types;

default_type  application/octet-stream;

log_formatmain  '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

sendfile        on;

keepalive_timeout  65;

server {

listen 80;

location / {

root   /usr/share/nginx/html;

index  index.html index.htm;

}

}

}

启动查看初始界面是否正常:

root@nginx>> nginx

root@nginx>> netstat -tupln|grep nginx

tcp        00 0.0.0.0:800.0.0.0:*                   LISTEN      1043/nginx

root@nginx>> curl -I 192.168.16.199

HTTP/1.1 200 OK

Server: nginx/1.0.15

Date: Mon, 14 Sep 2015 09:40:53 GMT

Content-Type: text/html

Content-Length: 3698

Last-Modified: Tue, 16 Jun 2015 21:34:15 GMT

Connection: keep-alive

Accept-Ranges: bytes

一切正常,首页有2张图片,正好用于实验:

root@html>> tree /usr/share/nginx/html/

/usr/share/nginx/html/

|-- 404.html

|-- 50x.html

|-- index.html

|-- nginx-logo.png

`-- poweredby.png

至此环境准备完毕。

2cache原理

3配置cache

3.1创建目录并挂载tmpfs

nginx的proxy_cache是基于内存和磁盘的缓存,需要指定缓存目录:

root@nginx>> mkdir /tmp/ngx_cache -p

缓存存放于磁盘,磁盘IO会影响缓存的速度,所以我们在将tmpfs挂载于ngx_cache目录上来加速缓存的读取和写入:

root@nginx>> mount -t tmpfs -o size=100M tmpfs /tmp/ngx_cache

root@nginx>> mount|grep tmpfs

tmpfs on /dev/shm type tmpfs (rw)

tmpfs on /tmp/ngx_cache type tmpfs (rw,size=100M)

3.2配置缓存目录大小以及key空间名

将下面配置放至http标签中:

root@nginx>> grep proxy_cache_path nginx.conf

proxy_cache_path /tmp/ngx_cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=5g;

#指定缓存目录,缓存等级,键空间名,键空间shm大小,失效时间,以及磁盘最大缓存大小

3.3配置反向代理

首先配置upstream节点池:

upstream server_pool {

server 127.0.0.1:8080;

}

在server标签的location段中配置代理:

proxy_pass http://server_pool;

配置8080端口的标签:

server {

listen 8080;

location / {

root /usr/share/nginx/html;

index index.html index.htm;

}

access_log/var/log/nginx/access.log  main;

}

配置proxy_cache相关参数启用缓存:

proxy_pass http://server_pool;

proxy_next_upstream http_502 http_504 error timeout invalid_header; #出错尝试下一个节点

proxy_cache cache_one; #缓存键空间名

proxy_cache_valid 200 304 12h; #指定对应状态码的缓存时间

proxy_cache_valid 301 302 1m;

proxy_cache_valid any 1m;

proxy_cache_key $host$uri$is_args$args; #指定键key的格式

proxy_set_header Host $host; #传递主机名给后端节点

proxy_set_header X-Forwarded-For $remote_addr; #传递客户端IP给后端节点

expires 1d; #超期时间

最终的nginx.conf配置文件如下:

root@nginx>> cat nginx.conf

user              nginx;

worker_processes  1;

error_log  /var/log/nginx/error.log;

pid        /var/run/nginx.pid;

events {

worker_connections  1024;

}

http {

include       /etc/nginx/mime.types;

default_type  application/octet-stream;

log_formatmain  '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"'

'"addr:$upstream_addr-status:$upstream_status- cachestatus:$upstream_cache_status"';

sendfile        on;

keepalive_timeout  65;

proxy_cache_path /tmp/ngx_cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=5g;

upstream server_pool {

server 127.0.0.1:8080;

}

server {

listen 80;

location / {

proxy_pass http://server_pool;

proxy_next_upstream http_502 http_504 error timeout invalid_header;

proxy_cache cache_one;

proxy_cache_valid 200 304 12h;

proxy_cache_valid 301 302 1m;

proxy_cache_valid any 1m;

proxy_cache_key $host$uri$is_args$args;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

expires 1d;

}

access_log  /var/log/nginx/cache_access.log  main;

}

server {

listen 8080;

location / {

root /usr/share/nginx/html;

index index.html index.htm;

}

}

}

3.4配置日志

为了观察缓存的命中状态,我们可以将缓存相关的变量记录在日志中。

定义日志格式:

log_format  main'$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"'

'"addr:$upstream_addr-status:$upstream_status- cachestatus:$upstream_cache_status"';

#其中upstream_addr记录分发的后端节点IP;upstream_status记录后端节点返回的状态码;upstream_cache_status记录缓存的命中情况。

在反向代理标签中引用日志:

access_log/var/log/nginx/cache_access.logmain;

nginx重新加载配置:

root@nginx>> nginx -s reload

3.5添加头信息查看

添加响应报头信息:

add_header X-Cache-Status $upstream_cache_status;

查看头信息:

root@~>> curl -I 192.168.16.199

HTTP/1.1 200 OK

Server: nginx/1.0.15

Date: Tue, 15 Sep 2015 02:55:25 GMT

Content-Type: text/html

Connection: keep-alive

Content-Length: 3698

Last-Modified: Tue, 16 Jun 2015 21:34:15 GMT

Expires: Wed, 16 Sep 2015 02:55:25 GMT

Cache-Control: max-age=86400

X-Cache-Status: HIT

Accept-Ranges: bytes

3.6监测缓存

为了监测缓存文件的事件,我们首先安装inotify-tools:

root@/>> yum install inotify-tools

打开一个ssh使用intofiy-tools检测ngx_cache目录:

root@~>> inotifywait -mrq /tmp/ngx_cache/

浏览网站:

root@ngx_cache>> inotifywait -mrq /tmp/ngx_cache/

/tmp/ngx_cache/ CREATE,ISDIR 6

/tmp/ngx_cache/ OPEN,ISDIR 6

/tmp/ngx_cache/ CLOSE_NOWRITE,CLOSE,ISDIR 6

/tmp/ngx_cache/ CREATE,ISDIR 1

/tmp/ngx_cache/ OPEN,ISDIR 1

/tmp/ngx_cache/ CLOSE_NOWRITE,CLOSE,ISDIR 1

/tmp/ngx_cache/ CREATE,ISDIR 3

/tmp/ngx_cache/ OPEN,ISDIR 3

/tmp/ngx_cache/ CLOSE_NOWRITE,CLOSE,ISDIR 3

/tmp/ngx_cache/3/ CREATE,ISDIR fd

/tmp/ngx_cache/3/ OPEN,ISDIR fd

/tmp/ngx_cache/3/ CLOSE_NOWRITE,CLOSE,ISDIR fd

/tmp/ngx_cache/3/fd/ CREATE dd404cd351f6b9efb072e5806dc2efd3.0000000026

/tmp/ngx_cache/3/fd/ OPEN dd404cd351f6b9efb072e5806dc2efd3.0000000026

/tmp/ngx_cache/3/fd/ MODIFY dd404cd351f6b9efb072e5806dc2efd3.0000000026

/tmp/ngx_cache/3/fd/ CLOSE_WRITE,CLOSE dd404cd351f6b9efb072e5806dc2efd3.0000000026

/tmp/ngx_cache/3/fd/ MOVED_FROM dd404cd351f6b9efb072e5806dc2efd3.0000000026

/tmp/ngx_cache/3/fd/ MOVED_TO dd404cd351f6b9efb072e5806dc2efd3

说明:有最后几行可知,图片缓存到目录中。

3.7查看hash对比

添加日志项:

'"KEY:$host$uri$is_args$args"'

重启查看日志项:

192.168.16.1 - - [15/Sep/2015:10:41:23 +0800] "GET /nginx-logo.png HTTP/1.1" 200 368 "http://192.168.16.199/" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0" "-""addr:--status:-- cachestatus:HIT""KEY:192.168.16.199/nginx-logo.png-"

计算MD5:

root@~>> echo -n "192.168.16.199/nginx-logo.png"|md5sum

6a6e2e4e3251b1aae0488859ed38e7b1  -

缓存文件:

/tmp/ngx_cache/1/7b/ ACCESS 6a6e2e4e3251b1aae0488859ed38e7b1

同时观察三个标红的,之前我们设置了levels=1:2,相当于小抽屉,和memcached的slab以及trunk类似。

Nginx配置ProxyCache缓存的更多相关文章

  1. nginx配置代理缓存

    nginx可以实现反向代理的配置,并且可以使用缓存来加速,本文是简单的实现功能的配置,暂时没有做其他的优化的部分的配置,从网上的资料来看,很多配置都是没有讲哪些是必须配置的,我自己在配置过程中就发现没 ...

  2. nginx配置资源缓存

    缓存nginx服务器的静态文件.如css,js,htm,html,jpg,gif,png,flv,swf,这些文件都不是经常更新.便于缓存以减轻服务器的压力. 打开配置文件/usr/local/ngi ...

  3. Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布

    一.Nginx安装(基于CentOS 6.5) 1.yum命令安装 yum install nginx –y(若不能安装,执行命令yum install epel-release) 2. 启动.停止和 ...

  4. nginx静态资源缓存策略配置

    1. 问题-背景 以前也经常用nginx,但用的不深,通常是简单的设置个location用来做反向代理.直到今天给客户做项目碰到缓存问题:客户有个app,只是用原生做了个壳,里面的内容都是用h5写的, ...

  5. NGINX负载均衡缓存配置

    环境:VMware-Workstation-12-Pro,Windows-10,CentOS-7.5,Xshell5 1 概述 如果我们的架构是前端负载均衡后端WEB集群时,可以开启nginx的缓存功 ...

  6. 14 nginx 中配置 expires缓存提升网站负载

    一:nginx 中配置 expires缓存提升网站负载 对于网站的图片,尤其是新闻站, 图片一旦发布, 改动的可能是非常小的.我们希望 能否在用户访问一次后, 图片缓存在用户的浏览器端,且时间比较长的 ...

  7. nginx 的 proxy_cache 缓存配置

    开头:某个项目涉及到 视频切片下载到本地,然后提供服务给客户端.一个视频有多个文件,存储在本地路径下.当客户端请求的视频在本地没有就会回源, 回源拿到的视频文件再返回给客户端,同时在本地缓存一份,提供 ...

  8. Nginx服务优化及优化深入(配置网页缓存时间、日志切割、防盗链等等)

    原文:https://blog.51cto.com/11134648/2134389 默认的Nginx安装参数只能提供最基本的服务,还需要调整如网页缓存时间.连接超时.网页压缩等相应参数,才能发挥出服 ...

  9. Nginx如何配置基础缓存

    // /path/to/cache/:用于缓存的本地磁盘目录 // levels :在 /path/to/cache/ 设置了一个两级层次结构的目录. // 将大量的文件放置在单个目录中会导致文件访问 ...

随机推荐

  1. python最重要的模块logging

    logging模块 这个模块是目前最重要的模块!!!我一定给讲透彻一点 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python中的loggi ...

  2. Mac设置SVN:Cornerstone3

    前因 在windows下用Tortoisesvn.可惜Tortoisesvn没有Mac版,只能上知乎寻找适合于 Mac的SVN软件. 经过 找到了一款名为Cornerstone的软件.在App Sto ...

  3. linux中的网络基础

    ifconfig -a 查看所有网口ifconfig eth 查看具体网口 ifup ethoifdown etho 网卡配置文件/etc/sysconfig/networkk-scripts/ifc ...

  4. 开源中文检索引擎Coreseek简单使用

    Coreseek结合MySQL使用简单示例,如下所示: echo 北京 | iconv -f gbk -t utf-8 | search -c D:\web\coreseek\etc\csft_mys ...

  5. [转]RC4加密已不再安全,破解效率极高

    原文链接:http://freebuf.com/news/72622.html 原文发表时间:2015.7.17 安全研究人员称,现在世界上近三分之一的HTTPS加密连接可被破解,并且效率极高.这种针 ...

  6. Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法

    在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论 ...

  7. waitKey()

    waitKey仅对窗口机制起作用,即namedWindow产生的窗口.若在此之前没有产生窗口,则waitKey相当于未执行. 注:namedWindow产生的窗口: namedWindow()+ims ...

  8. pid参数调节的几句话

    如果参数上升太快,降低Kp值,如果震荡太剧烈(振荡幅度过大),降低Ki值,如果曲线震荡部分上升下降太快则尝试调整Kd值.

  9. wordpress重力表单实时提醒功能教程(亲测可用)

    小七在写项目的时候遇到了一个需求:用户在填写完成表单的各个字段后要提交到后台,但是后台程序狗不能一直守着后台吧,程序狗也需要陪女朋友啊,好做一个即时提醒的功能吧,再也不担心用户提交的内容被错过了,第一 ...

  10. bzoj 1001 [BeiJing2006]狼抓兔子——最小割转最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 #include<cstdio> #include<cstring& ...