Nginx实现静态资源的缓存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx实现静态资源的缓存相关的知识,希望对你有一定的参考价值。

1.1   需求

1、对静态文件进行缓存:html,js,css,png,gif,jpg,jpeg,bmp,swf。

2、对符合url规则的请求进行缓存。

3、针对某个url进行清除缓存。

1.1   安装ngx_cache_purge

ngx_cache_purge是第三方开发的一个nginx模块,不包含在 Nginx 的源码发布版,它的作用是清理nginx缓存,对FastCGI、proxy、SCGI 和uWSGI缓存进行清除

 

第一步:把模块上传到服务器

第二步:重新编译nginx
第三步:解压ngx_cache_purge-2.3.tar.gz

第四步:重新编译nginx

1、进入nginx目录

2、重新设置编译参数

./configure \

--prefix=/usr/local/nginx \

--pid-path=/var/run/nginx/nginx.pid \

--lock-path=/var/lock/nginx.lock \

--error-log-path=/var/log/nginx/error.log \

--http-log-path=/var/log/nginx/access.log \

--with-http_gzip_static_module \

--http-client-body-temp-path=/var/temp/nginx/client \

--http-proxy-temp-path=/var/temp/nginx/proxy \

--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \

--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \

--http-scgi-temp-path=/var/temp/nginx/scgi \

--add-module=/usr/local/java/ngx_cache_purge-2.3

第五步:make

第六步:make install

 

1.1   配置nginx缓存

http {

    include       mime.types;

    default_type  application/octet-stream;

 

    #log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘

    #                  ‘$status $body_bytes_sent "$http_referer" ‘

    #                  ‘"$http_user_agent" "$http_x_forwarded_for"‘;

 

    #access_log  logs/access.log  main;

 

    sendfile        on;

    #tcp_nopush     on;

    #keepalive_timeout  0;

    keepalive_timeout  65;

    #gzip  on;

  

    upstream tomcat_server_pool{

       server 192.168.25.148:8080 weight=10;

       server 192.168.25.148:8081 weight=10;   #配置负载均衡的参数权重

    }

       #proxy_temp_path代理临时目录

       proxy_temp_path /var/temp/nginx/proxy;

       #proxy_cache_path代理缓存目录,和proxy_temp_path必须在同一个分区

       #/var/temp/nginx/proxy_cache_dir缓存目录

       #levels指定该缓存空间有两层hash目录,第一层目录名是1个字母或数字长度,第二层目录名为2个字母或数字长度

       #keys_zone=cache_one:50m缓存区名称为cache_one,在内存中的空间是50M,inactive=1d表示1天清空一次缓存 ,max_size指定磁盘空间大小为500M

       proxy_cache_path /var/temp/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1d max_size=500m;

    server {

       listen 80;

       server_name cache.test.com;

 

       #清空缓存配置,注意必须放在最上边,当在请求的url前加/purge/时将此url的缓存清空

       location ~ /purge(/.*)

        {

            #安全设置,指定请求客户端的IP或IP段才可以清除URL缓存,这里为了方便测试设置为all

            #allow          127.0.0.1;

            allow           all;

           #指定清空缓存的区域名称cache_one(要和上边proxy_cache_path缓存配置中指定的缓存区域名称一致)

           #指定缓存的key规则$host$1$is_args$args,要和下边设置缓存的key一致$host$uri$is_args$args

           #注意$host$1$is_args$args中的$1表示当前请求的uri,$host$1$is_args$args=$host$uri$is_args$args

            proxy_cache_purge cache_one $host$1$is_args$args;

        }

       #请求url以/item/开头的进行缓存,使用此location

       location ~ /item(/.*){

              #指定缓存区域名称

              proxy_cache cache_one;

              #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希

              proxy_cache_key $host$uri$is_args$args;

              #请求头中添加请求的主机名

              proxy_set_header Host  $host;

              #请求头中添加真实的客户端ip,通过X-Forwarded-For可获取

              proxy_set_header X-Forwarded-For  $remote_addr;

              #代理访问后端tomcat

              #请求item从缓存中找,如果缓存中没有则向tomcat请求

              #$1表示取出正则表达式(/.*)所匹配的内容,使用$1的效果例如请求http://ccc.test.com/item/100010.html则请求tomcat服务器 http://ip:port/100010.html

              #如果不使用$1则会将/item/...加在tomcat服务地址之后访问,即http://ip:port/item/100010.html

        proxy_pass http://tomcat_server_pool$1;

       }

       #请求url以.html、js、css、png、gif结尾和此location匹配成功

       location ~ .*\.(html|js|css|png|gif|jpg|jpeg|bmp|swf)$ {  

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

              proxy_next_upstream http_502 http_504 error timeout invalid_header;

              proxy_cache cache_one;

              #对不同的HTTP状态码设置不同的缓存时间

              proxy_cache_valid 200 10m;

              proxy_cache_valid 304 1m;

              proxy_cache_valid 301 302 1h;

              proxy_cache_valid any 1m;

             #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希

             proxy_cache_key $host$uri$is_args$args;

             proxy_set_header Host  $host;

             proxy_set_header X-Forwarded-For  $remote_addr;

             #如果没有缓存则通过proxy_pass转向tomcat请求

             proxy_pass http://tomcat_server_pool;

       }

       #所有的location规则都不满足走/,使用proxy_pass将请求转发给tomcat

       location /{

                 proxy_pass http://tomcat_server_pool;

                 index index.jsp index.html index.htm;

        }

  }

}

以上是关于Nginx实现静态资源的缓存的主要内容,如果未能解决你的问题,请参考以下文章

nginx配置静态资源缓存, 同时配合k8s的SVC(core dns)实现负载均衡

nginx配置静态资源缓存, 同时配合k8s的SVC(core dns)实现负载均衡

(010)Nginx静态资源web服务_浏览器缓存原理与演示

(010)Nginx静态资源web服务_浏览器缓存原理与演示

Nginx静态资源部署

Nginx静态资源服务器搭建