nginx静态资源优化实践

发布于:2021-10-03 21:46:07

众所周知,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访问方式为例,清除成功提示。?


              (完)

相关推荐

最新更新

猜你喜欢