nginx三 之缓存模块

Posted 哎哟~不错哦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx三 之缓存模块相关的知识,希望对你有一定的参考价值。

 

友情提示: 缓存模块是在动静分离的环境基础上搭建,动静分离可以参考http://www.cnblogs.com/dahuandan/p/6759212.html

 

介绍

提高网站响应速度是web应用不容忽视的目标,在之前动静分离的基础上,我们已经降低了后端服务器压力,提高了处理请求的性能,但是用户请求的静态资源是从硬盘读取,相比内存的性能还有很大的提高;

nginx自带的缓存模块可以把静态资源缓存到内存中,提高了用户请求静态资源的速度,并且nginx自带缓存模块配置简单,使用灵活,搭配第三方插件可以实现手动清除指定的缓存。

 

配置

 

添加缓存模块


#创建缓存目录
mkdir /dev/shm/demo
#进入nginx安装的conf目录
cd /usr/local/nginx/conf/

#打开nginx.conf文件添加以下内容:
proxy_temp_path /dev/shm/transfer/proxy_temp_path;
proxy_cache_path /dev/shm/transfer/proxy_cache_path levels=1:2 keys_zone=cache_one:6072m inactive=7d max_size=30g;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;

proxy_cache cache_one;
proxy_cache_valid 200 304 302 5d;
proxy_cache_valid any 7d;
proxy_cache_key $host$uri$is_args$args;
add_header X-Cache \'$upstream_cache_status from $host\';

 

 

完整的配置文件


#工作进程个数:多开几个可以减少io带来的影响,
#根据 lscpu查出来的cpus设置(一般为当前机器核心数的1-2倍,最大不超过8),
worker_processes 2; 

#worker_cpu_affinity需要结合worker_processes使用,一个worker_processes绑定一个CPU,
#比如两核是01,四核是0001,下面是8核绑定8个worker_processes的示例
worker_cpu_affinity 01 10;

#error_log logs/error.log info;


events {
    #使用epoll模型提高性能
    use epoll;

    #单个进程连接数(最大连接数=连接数*进程数)
    worker_connections 65535;
}


http {

    #文件扩展名与文件类型映射表 
    include mime.types;

    #默认文件类型 
    default_type application/octet-stream;

    
    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
    #注意:如果图片显示不正常把这个改成off
    sendfile on;


    #长连接超时时间,单位是秒 
    keepalive_timeout 65;

    #gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
    gzip on;
    gzip_min_length 1k; #最小1K
    gzip_buffers 16 64K;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain application/x- text/css application/xml application/;
    gzip_vary on;

    #header设置:用户真实的ip地址转发给后端服务器
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;

    #缓冲
    client_body_buffer_size 512k;
    proxy_connect_timeout 5;
    proxy_read_timeout 60;
    proxy_send_timeout 5;
    proxy_buffer_size 16k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;

    
    
    
    ##########################缓存#####################
    #设置缓存临时目录,要配合linux的内存目录/dev/shm使用的话,必须给赋予目录权限,因为默认root权限
    proxy_temp_path /dev/shm/demo/proxy_temp_path;

    #设置缓存目录,并设置Web缓存区名称为cache_one,内存缓存空间大小为128m,7天没有被访问的内容自动清除,硬盘缓存空间大小为5GB。
    proxy_cache_path /dev/shm/demo/proxy_cache_path levels=1:2 keys_zone=cache_one:128m inactive=7d max_size=5g;

    #启用html、jsp...<meta>标签不缓存的设置
    proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;


    
    ################################################集群 ###################################################    

    #动态资源集群
    upstream dynamic_server { 

        #服务器配置 weight是权重的意思,权重越大,分配的概率越大。 
        server 192.168.1.111:8080 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.1.111:8081 weight=1 max_fails=2 fail_timeout=30s; 
    } 


    #静态资源集群(一般由nginx管理,因为nginx处理静态资源性能好,如果服
    #务器有限,也可以部署在代理服务器本地)
    upstream static_server { 
        server 192.168.1.111:808 weight=1;
    }


    ################################################Nginx代理###################################################    
    server {

        #监听80端口,可以改成其他端口 
        listen 80;

        #nginx服务的域名,通过域名就可以访问应用
        server_name localhost;

        ##静态资源存放在nginx服务器的地址
        #root /opt/static/demo;


        #用于清除缓存的url设置
        #假设一个URL为demo/test.gif,那么就可以通过访问demo/purge/test.gif清除该URL的缓存。
        location ~ /purge(/.*) {

            #设置只允许指定的IP或IP段才可以清除URL缓存
            allow 127.0.0.1;
            allow 10.74.147.91;

            deny all;

            proxy_cache_purge cache_one $host$1$is_args$args;
        }


        #反向代理:网页、视频、图片文件从nginx服务器读取
        location ~ .*\\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
        { 

            ##########################缓存#####################
            #使用web缓存区cache_one
            proxy_cache cache_one;

            #对200 304 302状态码设置缓存时间5天,其他的7天
            proxy_cache_valid 200 304 302 5d;
            proxy_cache_valid any 7d;

            #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
            proxy_cache_key $host$uri$is_args$args;

            #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
            #proxy_next_upstream http_502 http_504 error timeout invalid_header;

            #增加一个header字段方便在浏览器查看是否击中缓存(生产中可注释)
            add_header X-Cache \'$upstream_cache_status from $host\';



            #反向代理,静态的由nginx来处理(不配置默认nginx的html目录,静态资源的目录结构必须和tomcat的web工程一致)
            proxy_pass http://static_server; 

            #浏览器中缓存30天
            expires 30d;
        } 


        #反向代理: 其他动态文件转发到后端的tomcat集群
        location ~ .*$ {

            proxy_pass http://dynamic_server; 
        }


        #错误提示页面
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }


    #静态资源服务器,这里监听本地808端口,因为静态资源服务器和代理服务器是同一台机器,所以有如下配置
    #如果是独立的服务器,直接在集群upstram配置即可。
    server{

        listen 808;

        server_name static;

        #反向代理:网页、视频、图片文件从nginx服务器读取
        location /
        { 
            #浏览器中缓存30天
            expires 30d;
        } 
    }
}
View Code

 

 

重新加载配置文件


/usr/local/nginx/sbin/nginx -s reload

 

 

测试

 

添加测试图片


 在/usr/local/nginx/html/demo目录下添加测试图片test.png

 

测试缓存


 1、当我们第一次访问测试图片地址 http://192.168.1.111/demo/test.png 是没有缓存命中的:

 

2、再次访 问http://192.168.1.111/demo/test.png 我们可以看到命中缓存了:

 

3、清除之前访问url的缓存:

 

以上是关于nginx三 之缓存模块的主要内容,如果未能解决你的问题,请参考以下文章

Nginx使用教程:使用Nginx缓存之Memcached缓存

Nginx详解模块

Nginx之Memcached上游服务器

Nginx 反向代理负载均衡页面缓存URL重写及读写分离具体解释

Nginx之HTTP过滤模块

Nginx系列之反向代理相关模块