nginx静态资源优化实践

众所周知,nginx是一款高性能的web和反向代理服务器,具有非常强大的功能,以及非常优越的性能。 
本文只针对nginx处理静态资源的优化,阐述具体实践过程。

主要包括两个方面:gizp压缩、proxy cache缓存。

1.开启gzip压缩功能 
gzip是一种压缩技术,静态资源的压缩率在30%左右,原理是服务端压缩后传递到浏览器进行解压解析,绝大部分浏览器都支持。 
nginx开启gzip配置

http {
     gzip  on;
     gzip_min_length 1k;
     gzip_buffers    16 64k;
     gzip_http_version 1.1;
     gzip_comp_level 4;
     gzip_types  text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
     gzip_vary on;
}

参数详细说明:

  • gzip on; 开启giz模块,默认是关闭的。
  • gzip_min_length 1k; 允许压缩的页面最小字节数,默认是全部都压缩,最好不要小于1k,因为小于1k的可能越压越大。
  • gzip_buffers 4 16k; 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
  • gzip_http_version 1.1; 设置http协议版本,只对1.1版本进行压缩。
  • gzip_comp_level 4; gzip压缩比/压缩级别,压缩级别 1-9,级别越高压缩率越大,当然压缩时间也就越长(传输快但比较消耗cpu)。
  • gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;设置压缩文件类型,这里指定了html、js、css。
  • gzip_vary on; 给http请求增加vary字段, 不支持gzip的不进行压缩处理。

在nginx中增加以上配置文件,重启之后再访问,在请求头中可以看到 Content-Encoding:gzip,说明已经起作用了。 
jquery-1.10.2.min.js的原始大小是92k,压缩之后是32k 

2.配置proxy cache缓存 
proxy cache缓存是nginx将静态资源存放到指定目录,缓存命中后直接返回,不需要再转发到后端获取,加快了请求速度同时也减轻了后端的压力。 
在配置之前,先增加一个模块ngx_cache_purge,是用来手动清除缓存的。

  • 下载并解压purge模块
wget  https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
tar zxvf 2.3.tar.gz
  • 1
  • 2
  • 在nginx编译中增加该模块
./configure --prefix=/data/nginx-1.9 --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --add-module=/data/src/ngx_cache_purge-2.3

make && make install
  • 1
  • 2
  • 3

nginx配置文件增加proxy cache:

http {
    proxy_temp_path   /data/nginx-1.9/proxy_temp;
    proxy_cache_path  /data/nginx-1.9/proxy_cache levels=1:2 keys_zone=cache_one:100m inactive=2d max_size=2g;

    upstream backend {
        server 192.168.3.*:8083 weight=1;
        server 192.168.3.*:8083 weight=1;
    }

    server {
        listen       80;
        server_name  192.168.3.*;
        root   html;
        index  index.html index.htm index.jsp;

        location ~ /purge(/.*) {
            allow   127.0.0.1;
            allow   101.71.*.*;
            deny    all;
            proxy_cache_purge  cache_one $host$1$is_args$args;
            error_page 405 =200 /purge$1;
        }

        location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
            proxy_pass  http://backend;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header   X-Real-IP   $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_cache cache_one;
            proxy_ignore_headers Cache-Control;
            add_header Nginx-Cache $upstream_cache_status;
            proxy_cache_valid  200 304 301 302 8h;
            proxy_cache_valid 404 1m;
            proxy_cache_valid  any 2d;
            proxy_cache_key $host$uri$is_args$args;
            expires 30d;
        }
}

参数详细说明:

  • proxy_temp_path:缓存临时目录。后端的响应并不直接返回客户端,而是先写到一个临时文件中,然后被rename一下当做缓存放在 proxy_cache_path。
  • proxy_cache_path:缓存目录,目录里的文件名是 cache_key 的MD5值。levels=1:2 表示采用2级目录结构;keys_zone=cache_one:100m inactive=2d max_size=2g;缓存区名称为cache_one;缓存的内存空间为100M,内存空间可多次使用;默认过期时间为2天,超过2天未被访问文件自动清除;最大文件存储为2G,超过后清除最少使用的数据。
  • proxy_cache:引用前面定义的缓存区 cache_one。
  • proxy_ignore_headers:忽略Cache-Control的请求头控制,依然进行缓存。例如对请求头设置cookie后,默认是不缓存的,需要增加忽略配置。
  • proxy_cache_key:定义cache_key。
  • proxy_cache_valid:为不同的响应状态码设置不同的缓存时间,比如200、302等正常结果可以缓存的时间长点,而404、500等缓存时间设置短一些,这个时间到了文件就会过期,而不论是否刚被访问过。
  • expires :在响应头里设置Expires:或Cache-Control:max-age,返回给客户端的浏览器缓存失效时间。
  • location ~ /purge(/.*) 是用于设置允许清除缓存的IP地址。

看一下请求效果,设置成功后,可以查看nginx的缓存状态,是否命中: Nginx-Cache:HIT。 

静态文件被缓存后,更新时需要清除nginx cache,这里以get访问方式为例,清除成功提示。 

(完)

你可能感兴趣的:(nginx)