众所周知,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
- 在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
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$is_args$args;
error_page 405 =200 /purge;
}
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访问方式为例,清除成功提示。
(完)